至少有两种方法可以用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()
。
对于哪种变体在这里更好,是否存在或多或少的共识?使用初始化方法是否有缺点(除了mentioned in the C++ FAQ可能会导致性能损失。)
答案 0 :(得分:6)
主要区别在于,如果不使用初始化列表,则会创建成员,然后为其分配值。使用初始化列表时,可以使用给定值直接创建成员。
使用初始化时的一种情况很重要,就是当你的类将一些引用作为成员保存时,有必要在构造它们时正确初始化这些成员:
class A
{
public:
A(B& bRef) : bRef_(bRef) { }
private:
B& bRef_;
}
您的init()
方法非常好。正如您自己提到的那样,您希望初始化这些成员的次数多于第一次构造此类实例的时间,因此为了可重用性和简单性,将其保留在方法中是正确的。 除非确实需要,否则不要尝试提高代码的性能。
有些人说制作正确的程序比制作快速程序更快更容易。;)
答案 1 :(得分:5)
创建数组(使用向量,或使用new
动态分配)时,您必须在使用构造函数时在其每个成员上显式调用init
,它将自动为所有元素调用
我更喜欢将基本初始化放入构造函数中,将更复杂的逻辑放入init方法中。在我看来,构造函数不应该执行任何复杂的操作。
答案 2 :(得分:0)
以下是使用初始化列表时的方案: