在C++中,初始化列表和在构造函数中赋值有什么区别,而不是每个方法的外观?我的意思是,使用其中一个而不是另一个有什么好处,为什么在幻灯片中的给定示例中(如下所示)只适用于初始化?(我希望你能添加一些资源,因为我没有找到)
发布于 2020-05-11 11:43:17
在构造函数中使用初始化列表是一个简单的过程,即在声明对象时初始化对象。它调用复制构造函数。
因此,昂贵的操作。
在C++中,类的常量或引用数据成员变量只能在初始化列表中初始化,不能使用构造函数体中的赋值。
常量和引用数据成员变量都具有必须在声明时初始化的属性。因此,只有在构造函数中使用初始化列表,因为初始化列表在声明时初始化类成员变量,而如果构造函数主体在声明后初始化数据成员,则赋值。
在某些情况下,构造函数中的数据成员初始化不起作用,必须使用初始化器列表。以下是这样的情况。
用于初始化非静态常量数据成员的
#包含使用命名空间标准;类测试{ const int t;public: Test(int t):t(t) {} //必须在getT() {t1 t;}}中使用初始化列表;int main() { Test t1(10);cout<
#include using namespace std;class Test { int &t;public: Test(int &t):t(t) {} //必须在getT() {t1 t;} };int main() { int x= 20;Test t1(x);cout<
用于初始化没有默认构造函数的成员对象的
#包含使用命名空间标准;类A{ int i;public: A(int );};A::A(int arg) {i= arg;cout <<“A的构造函数调用: Value of i:”<< I << endl;} // B类包含A类B的对象{A a;public: B(int );};B::B(int x):a(x) {//必须使用初始化列表cout <<“B的构造函数已调用”;} int main() {B obj(10);return 0;}
用于初始化基类members.
发布于 2020-05-11 11:36:45
如果不使用初始化列表,则类的数据成员将在到达构造函数正文之前默认构造:
class Foo{
private:
int bar;
public:
Foo(int _bar){//bar is default constructed here
bar = _bar; //bar is assigned a new value here
}
};对于像int这样的基础类型来说,这不是一个大问题,因为默认构造函数并不昂贵。但是,如果数据成员没有默认构造函数,或者默认构造后进行赋值比直接构造开销更大,则可能会出现问题:
//Bar does not have a default constructor, only a copy constructor
class Bar{
public:
Bar() = delete; //no default constructor
Bar(const Bar& bar); //copy constructor only
};
class Foo{
private:
Bar bar;
public:
Foo(const Bar& _bar){
//this will not compile, bar does not have a default constructor
// or a copy assignment operator
bar = _bar;
}
Foo(const Bar& _bar) : bar(_bar){//this will compile, copy constructor for bar called
}
};一般来说,使用初始化列表可以获得更高效的代码。
https://stackoverflow.com/questions/61721746
复制相似问题