初始化器列表与初始化方法 在C++中至少有两种初始化类的方法。
(1) 初始值设定项列表初始化器列表与初始化方法 在C++中至少有两种初始化类的方法。,c++,C++,(1) 初始值设定项列表 struct C { int i; C() : i(0) {} }; (2) 初始化方法 struct D { int i; C() { init(); } void init() { i = 0; } }; 我需要不时地重新初始化类的对象。对于第二种解决方案,我只需调用obj.init()。对于第一个解决方案,我要么添加一个基本上复制初始值设定项列表效果的init()函数,要么使用obj=C() 对于哪种变体更好,是否有或多或少的共
struct C
{
int i;
C() : i(0) {}
};
(2) 初始化方法
struct D
{
int i;
C() { init(); }
void init() {
i = 0;
}
};
我需要不时地重新初始化类的对象。对于第二种解决方案,我只需调用obj.init()
。对于第一个解决方案,我要么添加一个基本上复制初始值设定项列表效果的init()
函数,要么使用obj=C()
对于哪种变体更好,是否有或多或少的共识?使用初始值设定方法是否有缺点(除了可能的性能损失)。当创建数组(使用vector,或使用new
动态分配)时,在使用构造函数时,必须显式调用其每个成员上的init
,它将自动为所有元素调用
我更喜欢将基本初始化放在构造函数中,将更复杂的逻辑放在init方法中。在我看来,构造函数不应该执行任何复杂的操作。主要区别在于,在不使用初始化列表的情况下,创建成员,然后为其分配值。当您使用初始化列表时,将使用给定的值直接创建成员 当使用初始化非常重要时,其中一种情况是,您的类将某些引用作为成员保存,并且在构造这些成员时需要正确初始化这些成员:
class A
{
public:
A(B& bRef) : bRef_(bRef) { }
private:
B& bRef_;
}
这个问题也可以帮助你:
您的init()
方法非常好。正如您自己所提到的,您希望在构造此类实例时多次初始化这些成员,因此为了可重用性和简单性,将其保留在方法中是正确的除非您真的需要,否则不要试图提高代码的性能。
有人说,快速编写正确的程序比快速编写正确的程序容易。;) 以下是使用初始值设定项列表时的场景:
- 用于初始化非静态常量数据成员
- 用于初始化引用成员
- 用于初始化没有默认构造函数的成员对象
- 用于初始化基类成员
- 当构造函数的参数名与数据成员相同时
- 出于性能原因
init
就可以了。