- 一般情况下使用Member Initialization List和在构造函数体内部初始化差不都,在四种情况下,必须使用Member Initialization List。
- 当初始化一个refernce member时
- 当初始化一个const member时
- 当调用一个base class的constructor,而他拥有一组参数时
- 当调用一个member class 的constructor,而他有一组参数时
class Word{
String _name;
int _cnt;
public:
Word(){//构造函数体内
_name = 0;
_cnt = 0;
}
};
此时编译器会产生一个临时对象来为其赋值,构造函数转化为
Word::word()
{
_name.String::String();//调用String构造函数
String temp = String( 0 );//产生一个临时对象
_name.String::operator=( temp );//拷贝赋值给成员
temp.String::~String();//摧毁临时对象
_cnt = 0;
}
如果用Member Initialization List则会直接调用类成员的构造函数,无需创建临时对象,效率较高
Word::Word():_name(0)
{
_cnt = 0;
}
//会转化为
Word::Word()
{
_name.String::String(0);
_cnt = 0;
}
由扩展代码可以看出来,编译器会一一操作Member Initialization List中的构造动作,并且时在构造函数中用户自定义操作的前面完成。注意,真正实现的操作顺序是与类中的成员声明的顺序一致,而不是与Member Initialization List中的排列顺序一致。
网友评论