美文网首页
Member Initialization List

Member Initialization List

作者: FakeCSer爱去网吧 | 来源:发表于2020-04-30 12:58 被阅读0次
    • 一般情况下使用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

          本文链接:https://www.haomeiwen.com/subject/qihzwhtx.html