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
  • 相关阅读:
    python requests用法总结
    Linux统计某文件夹下文件的个数
    PM2使用及介绍
    如何区分USB 2.0 和USB 3.0插口
    npm突然找不到npm-cli.js的解决方法
    mRemoteNG
    js中几种实用的跨域方法原理详解
    Tornado异步阻塞解决方案
    [阅读笔记]EfficientDet
    iOS 保存视频AVAssetWriter
  • 原文地址:https://www.cnblogs.com/lizhenghao126/p/11053700.html
Copyright © 2011-2022 走看看