当前位置: 首页 > news >正文

C++成员初始化列表

类对象的构造顺序是这样的:
1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
        初始化阶段可以是显式的或隐式的,取决于是否存在成员初始化表。隐式初始化阶段按照声明的顺序依次调用所有基类的缺省构造函数,然后是所有成员类对象的缺省构造函数。
2.进入构造函数后在构造函数中执行一般计算

        计算阶段由构造函数体内的所有语句构成。在计算阶段中,数据成员的设置被认为是赋值,而不是初始化。

使用初始化列表有两个原因:

1.必须这样做:

        三种情况下需要使用初始化成员列表
        1)对象成员;
        2)const修饰的成员;
        3)引用成员数据;

(1)如果有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一步,就会报错。

using namespace std; class ABC { public : ABC( int x, int y, int z):a(x),b(y),c(z) {} ; private : int a; int b; int c; } ; class MyClass { public : MyClass( int a, int b, int c):abc(a,b,c) {} private : ABC abc; } ; int main() { MyClass o( 1 , 2 , 3 ); return 0 ; }

(2)当类成员中含有一个const成员时

(3)当类成员中含有一个引用时

 2.效率要求这样做:

类对象的构造顺序显示,进入构造函数体后,进行的是计算,是对他们的赋值操作,显然,赋值和初始化是不同的,这样就体现出了效率差异,如果不用成员初始化列表,那么类对自己的类成员分别进行的是一次隐式的默认构造函数的调用,和一次复制操作符的调用,如果是类对象,这样做效率就得不到保障。

注意:构造函数需要初始化的数据成员,不论是否显式的出现在构造函数的成员初始化列表中,都会在该处完成初始化,并且初始化的顺序和其在声明时的顺序是一致的,与列表的先后顺序无关,所以要特别注意,保证两者顺序一致才能真正保证其效率。

现在明白为什么要使用成员初始化列表了。

这里再强调一下类的初始化的顺序,应该是类成员变量的初始化不是按照初始化表的顺序被初始化的,而是按照在类中声明的顺序被初始化的。
这是摘自:Effective C++学习笔记:初始化列表中成员列出的顺序和它们在类中声明的顺序相同 http://www.cppblog.com/xczhang/archive/2008/01/22/41613.html

为什么会这样呢?我们知道,对一个对象的所有成员来说,它们的析构函数被调用的顺序总是和它们在构造函数里被创建的顺序相反。那么,如果允许上面的情况(即,成员按它们在初始化列表上出现的顺序被初始化)发生,编译器就要为每一个对象跟踪其成员初始化的顺序,以保证它们的析构函数以正确的顺序被调用。这会带来昂贵的开销。所以,为了避免这一开销,同一种类型的所有对象在创建(构造)和摧毁(析构)过程中对成员的处理顺序都是相同的,而不管成员在初始化列表中的顺序如何。

注意:上述内容不适用于static变量,static变量应该在类的构造函数前被初始化。

 

相关文章:

  • 在父子关系表中获取子孙后代结点数据SQL查询算法
  • C#网络编程之Socket一
  • [笔记].使用Protues仿真Max7129
  • 做一个懂爱的聪明女人
  • 如何创建一个MVC模式的Joomla组件教程(十五) - 创建管理员界面 增加编辑功能 上...
  • 二招搞定IE快捷方式没法打开
  • StatsPack 使用初解
  • ArcGIS中对一组查询结果同时闪烁的实现
  • 鸟哥的基础学习-习题与答案
  • 我的人生谚语
  • 梅德克领导AMD成功转变,明年或将在中国市场持续发力?
  • 基于网络数据采集系统的社交媒体/网络营销
  • SQL创建用户及角色
  • Net设计模式实例之单例模式( Singleton Pattern)
  • vxvm之卷管理
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 【知识碎片】第三方登录弹窗效果
  • Java 多线程编程之:notify 和 wait 用法
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • mysql innodb 索引使用指南
  • PV统计优化设计
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • SQLServer之创建显式事务
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Vue小说阅读器(仿追书神器)
  • 百度地图API标注+时间轴组件
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用 @font-face
  • 使用docker-compose进行多节点部署
  • 以太坊客户端Geth命令参数详解
  • 异步
  • 源码安装memcached和php memcache扩展
  • 回归生活:清理微信公众号
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (12)目标检测_SSD基于pytorch搭建代码
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (六)Hibernate的二级缓存
  • (未解决)macOS matplotlib 中文是方框
  • (转)一些感悟
  • ***通过什么方式***网吧
  • .net知识和学习方法系列(二十一)CLR-枚举
  • // an array of int
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @property括号内属性讲解
  • @RequestBody与@ResponseBody的使用
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [20171106]配置客户端连接注意.txt
  • [383] 赎金信 js
  • [Android] 修改设备访问权限
  • [BUAA软工]第一次博客作业---阅读《构建之法》
  • [CF482B]Interesting Array