Effective C++ 条款12: 尽量使用初始化而不要在构造函数里赋值

本条款实际上在解决一个疑问,为什么要有成员初始化列表这个东西,直接在构造函数里赋值不行吗?

条款给出了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)
原文地址:https://www.cnblogs.com/helloweworld/p/3121413.html