zoukankan      html  css  js  c++  java
  • [深度探索C++对象模型]关于成员初始化列表(member initiallization list)

    四种特殊情况:

    1、当初始化一个reference 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 的constructor会先产生一个临时性的string object,然后将它初始化,随后赋值给_name,其代码可能会扩张成这样:

    Word::Word()
    {
        //调用String的默认构造函数
        _name.String::String();
    
        //产生一个临时对象
        String temp=String(0);
    
        //“memberwise”地拷贝_name
        _name.String::operator=(temp);
    
        //摧毁临时对象
        temp.String::~String();
    
        _cnt=0;
    }

    注意事项

    编译器在实现initialization list时,以适当顺序在constructor之内安插初始化操作,并且在任何explict user code之前。但是有一些细微的地方要注意:list之中的项目顺序是由class中成员变量的声明顺序决定的,不是由initialization list中的排列顺序决定的,例如:

    class X
    {
         int i;
         int j;
     public:
     X(int val):j(val),i(j)
     {...}
    }
    //错误!,i会在j之前先初始化,所以会出错!
    https://github.com/li-zheng-hao
  • 相关阅读:
    读书笔记—CLR via C#线程25-26章节
    算法回顾--N皇后问题简单回顾
    编程拾趣--集合子集问题
    读书笔记—CLR via C#异常和状态管理
    读书笔记—CLR via C#字符串及文本
    设计模式---抽象工厂
    读书笔记—CLR via C#反射
    读书笔记—CLR via C#委托和attribute
    C#编程实践—EventBroker简单实现
    Linux平台屏幕录像工具RecordMyDesktop
  • 原文地址:https://www.cnblogs.com/lizhenghao126/p/11053700.html
Copyright © 2011-2022 走看看