[转]C++ 初始化列表的初始化顺序
构造函数初始化列表仅用于初始化成员的值,并不指定这些初始化执行的次序。成员被初始化的次序就是定义成员的次序。第一个被定义的成员先被初始化,依次类推。一般,初始化的顺序无关紧要,然而,如果一个成员是根据其他成员而初始化,则成员的初始化顺序是至关重要的。
class x {
int i;//声明顺序是先i,后j,故初始化列表中,会先初始化i,在初始化j
int j;
public:
x(int tem): j(tem),i(j){} //看起来是先初始化j,然后初始化i,其实恰恰相反,先用未初始化的j来初始化i,虽然编译器不会提示你什么,但是j未初始化它便由计算机随即分配的内存存储,它的值也是随即的,这个值可能不是你想要的,错误就出现了。将i和j的声明顺序调过来就没有问题了。
};
总的来说,有虚基类时,初始化列表调用构造函数初始化的顺序如下:
1)虚基类的构造函数
2)根据派生类声明的顺序调用派生类的构造函数,对虚基类构造函数的调用被忽略
3)根据派生类对象声明的顺序调用对象所属派生类的虚基类构造函数、对象所属派生类的构造函数
无虚基类时,初始化列表调用构造函数初始化的顺序如下:
1)根据派生类声明的顺序调用对象所属派生类的基类构造函数、接着是派生类的构造函数
2)根据派生类对象声明的顺序调用对象所属派生类的基类构造函数、对象所属派生类的构造函数
转自:http://blog.sina.com.cn/s/blog_508938e10102v1es.html
[转]C++ 初始化列表的初始化顺序的更多相关文章
- c++中初始化列表的初始化变量顺序问题
例题来看:请问下面程序打印出的结果是什么? #include <iostream> #include <string> using namespace std; class b ...
- C++类成员初始化列表的构造顺序
看下面代码, 输出结果是多少呢? class A{ public: A(int k) : j(k), i(j) { } void show() { cout << this->i & ...
- 【c++】必须在类初始化列表中初始化的几种情况
转自:http://www.cnblogs.com/kaituorensheng/p/3477630.html 1. 类成员为const类型 2. 类成员为引用类型 #include <iost ...
- c++使用初始化列表来初始化字段
#include<iostream> using namespace std; class Student1 { private: int _a; int _b; public: void ...
- Effective C++学习笔记:初始化列表中成员列出的顺序和它们在类中声明的顺序相同
类成员的默认初始化顺序是按照声明顺序进行, 如果使用初始化列表初始化成员变量, 则必须按照成员变量的声明顺序进行; 否则, 在变量之间交替赋值时, 会产生, 未初始化的变量去赋值其他变量; 同时GCC ...
- C++中类成员变量在初始化列表中的初始化顺序
引子:我们知道,C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的. 先看代码: class TestClass1 { public: TestClass1() { cout << ...
- C++类构造函数初始化列表
C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public: ...
- c++ 关于类构造函数的初始化列表
除了性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型,引用必须在定义的时候初始化,并且不能重 ...
- 从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数
一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一).对象成员及其初始化 C++ Code 1 2 3 4 5 6 7 8 9 1 ...
随机推荐
- 提取DirectShow中视频采集的数据
DirectShow中,数据流(Data Flow)都是依次流过各个Filter的.它对数据的管理也有自己的方法,而且并没有向用户提供一个统一的接口,供用户操作数据流.这里以提取视频采集在的每帧为位图 ...
- Openstack_O版(otaka)部署_Horizon部署
控制节点 1. 安装软件包 yum install openstack-dashboard -y 2. 修改配置文件 vim /etc/openstack-dashboard/local_settin ...
- Python 爬取 中关村CPU名字和主频
0.准备工作 1.相关教程 Python 爬虫系列教程:http://cuiqingcai.com/1052.html Python Web课程:http://ww ...
- Maven使用中央仓库下载慢的解决办法
配置Maven仓库的方法 打开Maven配置文件Setting.xml,如下: vim /Users/yuanweipeng/.m2/settings.xml 在配置文件中添加如下配置: <mi ...
- BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)
BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...
- 【BZOJ3924】幻想乡战略游戏(动态点分治)
[BZOJ3924]幻想乡战略游戏(动态点分治) 题面 权限题...(穷死我了) 洛谷 题解 考虑不修改 发现一个贪心的做法 假设当前放在当前位置 如果它有一个子树的兵的总数大于总数的一半 那么,放到 ...
- 多米诺骨牌放置问题(状压DP)
例题: 最近小A遇到了一个很有趣的问题: 现在有一个\(n\times m\)规格的桌面,我们希望用\(1 \times 2\)规格的多米诺骨牌将其覆盖. 例如,对于一个\(10 \times 11\ ...
- 测试一下OpenLiveWriter
$$ \sum_{0}^{n} k_i $$ OpenLiveWriter好丑啊啊啊啊,什么鬼?
- angular何时触发脏检查机制
ng只有在指定事件触发后,才进入$digest cycle: DOM事件,譬如用户输入文本,点击按钮等.(ng-click) XHR响应事件 ($http) 浏览器Location变更事件 ($loc ...
- 在hive下使用dual伪表
[hive@nn1 ~]$ touch dual.txt[hive@nn1 ~]$ echo 'X' >dual.txt hive> load data local inpath '/ho ...