Member Initialization List

  • 一般情况下使用Member Initialization List和在构造函数体内部初始化差不都,在四种情况下,必须使用Member Initialization List。
    1. 当初始化一个refernce member时
    2. 当初始化一个const member时
    3. 当调用一个base class的constructor,而他拥有一组参数时
    4. 当调用一个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中的排列顺序一致。

你可能感兴趣的:(Member Initialization List)