深度探索C++ 对象模型(5)-Initialization list(3)
四点:
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)相关推荐
- 深度探索C++ 对象模型(5)-Initialization list(2)
Initialization list的作用是效率 如下代码可以编译并运行,但是效率低下 class Word {String _name;int _cnt;public:Word() { _name ...
- 深度探索C++ 对象模型(5)-Initialization list(1)
以下四种情况,一定要使用成员初始化列表: 1.初始化一个引用成员 2.初始化一个const成员 示例代码为 class Shape{const int m_size; //const 常量int &a ...
- 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学
<深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书 ...
- 深度探索C++对象模型第2章 构造函数语义学
默认构造函数 两个误区: 1 任何class如果没有定义默认构造函数,就会被合成一个出来:只有在某些情况下被合成 2 编译器合成出来的默认构造函数会明确设定class中每一个数据成员的默认值 :默认值 ...
- 第2章构造函数语义学读书笔记——深度探索c++对象模型
深度探索c++对象模型 第2章 构造函数语义学 2.1 Default Constructor的构建操作 2.2 Copy Constructor的构造操作 2.3 程序转化语义学 2.4 成员的初始 ...
- 深度探索C++ 对象模型(7)-Data member的布局(虚继承)
虚拟继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...
- 深度探索C++ 对象模型(7)-Data member的布局(多重继承)
多重继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...
- 深度探索C++ 对象模型(7)-Data member的布局(无继承、继承无多态、继承多态、多层继承)
无继承 继承无多态 继承多态 虚表 : 用来存放基类的每一个虚函数,再加上首位的一个slots(支持RTTI). 每个class object导入一个vptr,提供执行期的链接,使得每一个class ...
最新文章
- Django+Echarts画图实例
- ActivityInfo taskAffinity
- linux server添加硬盘,新增硬盘扩充linux ftp server空间
- 李宏毅老师ML_HW1——PM2.5预测
- centos 静态拨号
- 字符串模式匹配——最长公共子序列与子串 KMP 算法
- 弹出框之对话框和提示框,可共用代码
- python gzip压缩_Python gzip –压缩解压缩
- Visual Studio开发工具分配字符数组的问题
- 01 ZooKeeper初探
- 文字处理技术:文字形状绕排不是挺简单的事吗,怎么搞得这么复杂
- 富士施乐Fuji Xerox DocuPrint P158 b 驱动
- sumif单列求和_有关多列条件求和对30列数据条件求和的快速SUMIF公式
- linux字体不识别不了怎么办,Docker容器不识别宋体等字体的解决方案
- 今天女神打了个电话让我去修电脑,无数次戳中笑点
- GDAL综合整理--7:GDAL实用工具简介
- 咬断防盗绳偷 iPhone,月入万元不是梦
- 掩码、反掩码和通配符
- 【Python编程:从入门到实践】第四章:操作列表
- python程序设计与算法基础江红答案_《Python程序设计与算法基础教程(第二版)》江红 余青松,第十一章课后习题答案...
热门文章
- 怎么样用idea上传git?-通俗易懂
- 高校邦python程序设计基础篇_高校邦Python程序设计基础【实境编程】章节答案
- linux去掉java路径_Java显示目录文件列表和删除目录
- # 管道已结束_CIPP内衬紫外线固化法用于污水管道非开挖修复
- 何所思 | 数据中心二十条
- UPS故障案例集(二)
- 计算机usb接口充电效率差,usb2.0和3.0的区别 从传输速度和充电效率等来区别
- BigData之Hadoop:Hadoop的简介、深入理解、下载、案例应用之详细攻略
- Interview:算法岗位面试—2019秋招校园招聘—算法工程师【机器学习、深度学习(偏图像)】秋招感悟:初期阶段的傲娇→中期阶段的紧张→后期阶段的蜕变
- Matlab:成功解决Expression or statements is incorrect--possibly unbalanced (,{,[.