Member Initialization List

2020-04-30  本文已影响0人  FakeCSer爱去网吧
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中的排列顺序一致。

上一篇下一篇

猜你喜欢

热点阅读