四点:

1.list中的项目次序是由class中的members声明次序决定,不是由initialization list中的的代码决定

如下代码有一个陷阱,i值为一个不可预知未初始化的值。原因是按照定义 的顺序,i先被初始化,这个时候j还没有被初始化。

 class X {public:int i;int j;public: X(int val) : j(val), i(j) {}};

执行测试代码,输出结果为:val is 1 100

X obj0(100);
cout << "val is " << obj0.i << "  " << obj0.j << endl;;

2. initialization list的代码先于构造函数代码执行

3.可以调用member function 以设定一个member的初值 (this已经生成)

class X   {int i;int xfoo( int val)  {return val;}
public:X(int val) : i ( xfoo(val) ) //这里是正确的{}
};

构造函数等价于

 X::X() {i = this->xfoo( val ); }

执行测试代码,输出结果为:val is 100 ,没问题!

X obj2(100);
cout << "val is " << obj2.i << endl;

4.调用基类的构造和初始化成员的顺序,也会有问题

 class X{public:X(int x) :val(x) {}          // A 的构造函数int val;int getVal() {return val;}};class FooBar : public X {int _fVal;public:int fval() {return _fVal;}FooBar(int val) : _fVal(val), X(fval()) {   }};

调用顺序为

X::X(this, this->fval());//此时_fVal还未初始化
_fVal = val;

执行测试代码,输出结果为:val is 100 1

FooBar obj(100);
cout << "val is "<< obj.fval() << "  "<< obj.getVal()<< endl;

【引用】
[1]: <<深度探索C++ 对象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 译
[2]: 代码地址 https://github.com/thefistlei/cplusStudy.git

深度探索C++ 对象模型(5)-Initialization list(3)相关推荐

  1. 深度探索C++ 对象模型(5)-Initialization list(2)

    Initialization list的作用是效率 如下代码可以编译并运行,但是效率低下 class Word {String _name;int _cnt;public:Word() { _name ...

  2. 深度探索C++ 对象模型(5)-Initialization list(1)

    以下四种情况,一定要使用成员初始化列表: 1.初始化一个引用成员 2.初始化一个const成员 示例代码为 class Shape{const int m_size; //const 常量int &a ...

  3. 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学

     <深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...

  4. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书 ...

  5. 深度探索C++对象模型第2章 构造函数语义学

    默认构造函数 两个误区: 1 任何class如果没有定义默认构造函数,就会被合成一个出来:只有在某些情况下被合成 2 编译器合成出来的默认构造函数会明确设定class中每一个数据成员的默认值 :默认值 ...

  6. 第2章构造函数语义学读书笔记——深度探索c++对象模型

    深度探索c++对象模型 第2章 构造函数语义学 2.1 Default Constructor的构建操作 2.2 Copy Constructor的构造操作 2.3 程序转化语义学 2.4 成员的初始 ...

  7. 深度探索C++ 对象模型(7)-Data member的布局(虚继承)

    虚拟继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...

  8. 深度探索C++ 对象模型(7)-Data member的布局(多重继承)

    多重继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...

  9. 深度探索C++ 对象模型(7)-Data member的布局(无继承、继承无多态、继承多态、多层继承)

    无继承 继承无多态 继承多态 虚表 : 用来存放基类的每一个虚函数,再加上首位的一个slots(支持RTTI). 每个class object导入一个vptr,提供执行期的链接,使得每一个class ...

最新文章

  1. Django+Echarts画图实例
  2. ActivityInfo taskAffinity
  3. linux server添加硬盘,新增硬盘扩充linux ftp server空间
  4. 李宏毅老师ML_HW1——PM2.5预测
  5. centos 静态拨号
  6. 字符串模式匹配——最长公共子序列与子串 KMP 算法
  7. 弹出框之对话框和提示框,可共用代码
  8. python gzip压缩_Python gzip –压缩解压缩
  9. Visual Studio开发工具分配字符数组的问题
  10. 01 ZooKeeper初探
  11. 文字处理技术:文字形状绕排不是挺简单的事吗,怎么搞得这么复杂
  12. 富士施乐Fuji Xerox DocuPrint P158 b 驱动
  13. sumif单列求和_有关多列条件求和对30列数据条件求和的快速SUMIF公式
  14. linux字体不识别不了怎么办,Docker容器不识别宋体等字体的解决方案
  15. 今天女神打了个电话让我去修电脑,无数次戳中笑点
  16. GDAL综合整理--7:GDAL实用工具简介
  17. 咬断防盗绳偷 iPhone,月入万元不是梦
  18. 掩码、反掩码和通配符
  19. 【Python编程:从入门到实践】第四章:操作列表
  20. python程序设计与算法基础江红答案_《Python程序设计与算法基础教程(第二版)》江红 余青松,第十一章课后习题答案...

热门文章

  1. 怎么样用idea上传git?-通俗易懂
  2. 高校邦python程序设计基础篇_高校邦Python程序设计基础【实境编程】章节答案
  3. linux去掉java路径_Java显示目录文件列表和删除目录
  4. # 管道已结束_CIPP内衬紫外线固化法用于污水管道非开挖修复
  5. 何所思 | 数据中心二十条
  6. UPS故障案例集(二)
  7. 计算机usb接口充电效率差,usb2.0和3.0的区别 从传输速度和充电效率等来区别
  8. BigData之Hadoop:Hadoop的简介、深入理解、下载、案例应用之详细攻略
  9. Interview:算法岗位面试—2019秋招校园招聘—算法工程师【机器学习、深度学习(偏图像)】秋招感悟:初期阶段的傲娇→中期阶段的紧张→后期阶段的蜕变
  10. Matlab:成功解决Expression or statements is incorrect--possibly unbalanced (,{,[.