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
  • 相关阅读:
    C语言strcasecmp()函数:判断字符串是否相等(忽略大小写)
    C语言之strrchr函数
    【Android】adb connect 手机的两种方式
    python web框架介绍对比
    sublime text 3 + python配置,完整搭建及常用插件安装
    Sublime text 3 快捷键:
    sublime text3 插件CTags
    sublime text 3 并列显示
    python 保存csv文件
    pandas 读取文件
  • 原文地址:https://www.cnblogs.com/lizhenghao126/p/11053700.html
Copyright © 2011-2022 走看看