[英]Initializer list vs. initialization method
至少有两种方法可以在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()
。
对于哪种变体在这里更好,是否存在或多或少的共识? 使用初始化方法是否有缺点(除了C ++ FAQ中提到的可能的性能损失)。
主要区别在于,如果不使用初始化列表,则会创建成员,然后为其分配值。 使用初始化列表时,可以使用给定值直接创建成员。
在使用初始化时,其中一种情况很重要,就是当您的类将某些引用作为成员保存时,有必要在构造它们时正确初始化这些成员:
class A
{
public:
A(B& bRef) : bRef_(bRef) { }
private:
B& bRef_;
}
这个问题也可以帮到你: 在这个特定的情况下,使用成员初始化列表和在构造函数中赋值是否有区别?
你的init()
方法非常好。 正如您自己提到的那样,您希望初始化这些成员的次数多于第一次构造此类实例的时间,因此为了可重用性和简单性,将其保留在方法中是正确的。 除非您确实需要,否则不要尝试提高代码的性能。
有人说, 快速制作正确的程序比制作快速程序更容易。 ;)
在创建数组(使用向量或使用new
动态分配)时,您必须在使用构造函数时在其每个成员上显式调用init
,它将自动为所有元素调用。
我更喜欢将基本初始化放入构造函数中,将更复杂的逻辑放入init方法中。 在我看来,构造函数不应该执行任何复杂的操作。
以下是使用初始化程序列表时的方案:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.