我偏爱在构造函数中使用成员初始化列表……但我早就忘记了这背后的原因……
您在构造函数中使用成员初始化列表吗?如果是这样,为什么?如果不是,为什么不呢?
对于POD类成员来说,这没有什么区别,只是风格问题。对于作为类的类成员,它避免了对默认构造函数的不必要调用。考虑:
class A { public: A() { x = 0; } A(int x_) { x = x_; } int x; }; class B { public: B() { a.x = 3; } private: A a; };
在这种情况下, for 的构造函数B会调用 的默认构造函数A,然后初始化a.x为 3。更好的方法是让B的构造函数直接A在初始化列表中调用 的构造函数:
B
A
a.x
B() : a(3) { }
这只会调用A‘s 的A(int)构造函数,而不是它的默认构造函数。在此示例中,差异可以忽略不计,但想象一下,如果您将A默认构造函数做得更多,例如分配内存或打开文件。您不会不必要地这样做。
A(int)
此外,如果类没有默认构造函数,或者您有const成员变量,则 必须 使用初始化列表:
const
class A { public: A(int x_) { x = x_; } int x; }; class B { public: B() : a(3), y(2) // 'a' and 'y' MUST be initialized in an initializer list; { // it is an error not to do so } private: A a; const int y; };