本条款实际上在解决一个疑问,为什么要有成员初始化列表这个东西,直接在构造函数里赋值不行吗?
条款给出了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)