本条款实际上在解决一个疑问,为什么要有成员初始化列表这个东西,直接在构造函数里赋值不行吗?
条款给出了2点理由:
1.有些情况下必须用初始化——特别是const和引用数据成员只能用初始化,不能被赋值。
2.成员初始化列表的效率比赋值的效率高。
看第一种情况:
class A { const int constVal; public: // A() { constVal = 0;} //error A() : constVal(0) {} //right };
看第二种情况,先看在构造函数里赋值的情况,这时要调用A的构造函数和赋值构造函数:
class A { public: A() {cout << "A()" << endl;} A& operator=(A &a) {cout << "A& operator=(A &a)" << endl; return *this;} }; class B { A a; public: B(A &aa) { a = aa; //先调用A()构造a对象,然后调用A& operator=(A &a)赋值。 cout << "B(A &aa)" << endl; } B& operator=(B &b) { cout << "B operator=" << endl; return *this; } }; int main(void) { A a; B b(a); return 0; }
输出:
A()
A()
A& operator=(A &a)
B(A &aa)
再看成员初始化列表初始化,这时只需调用A的copy构造函数:
class A { public: A() {cout << "A()" << endl;} A(A& a) {cout << "A(A& a)" << endl;} A& operator=(A &a) {cout << "A& operator=(A &a)" << endl; return *this;} }; class B { A a; public: B(A &aa): a(aa) { cout << "B(A &aa): A(aa)" << endl; } B& operator=(B &b) { cout << "B operator=" << endl; return *this; } }; int main(void) { A a; B b(a); return 0; }
输出:
A()
A(A& a)
B(A &aa): A(aa)