C++中类成员变量在初始化列表中的初始化顺序
引子:我们知道,C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的。
先看代码:
1 class TestClass1 2 { 3 public: 4 TestClass1() { 5 cout << "TestClass1()" << endl; 6 } 7 TestClass1(const TestClass1&) { cout << "TestClass1(const TestClass1&)" << endl; } 8 TestClass1& operator=(const TestClass1&) { cout << "TestClas1s& operator=(const TestClass1&)" << endl; return *this; } 9 ~TestClass1() { 10 cout << "~TestClass1()" << endl; 11 } 12 }; 13 14 class TestClass2 15 { 16 public: 17 TestClass2() { 18 cout << "TestClass2()" << endl; 19 } 20 TestClass2(const TestClass2&) { cout << "TestClass2(const TestClass2&)" << endl; } 21 TestClass2& operator=(const TestClass2&) { cout << "TestClass2& operator=(const TestClass2&)" << endl; return *this; } 22 ~TestClass2() { 23 cout << "~TestClass2()" << endl; 24 } 25 }; 26 27 class Test 28 { 29 public: 30 Test() = default; 31 Test(TestClass1& tc1, TestClass2& tc2) :m_tc2(tc2), m_tc1(tc1){} 32 private: 33 TestClass1 m_tc1; 34 TestClass2 m_tc2; 35 };
1 int main() 2 { 3 Test t; 4 }
程序结果为:
现象:先调用TestClass1的构造函数,再调用TestClass2的构造函数。
原因:在类Test中,m_tc1变量声明在m_tc2变量之前,故m_tc1在m_tc2之前初始化。
问题:在列表初始化的构造函数中,将m_tc2放在m_tc1之前,是否可以让m_tc2在m_tc1之前初始化?
代码设计
int main() {TestClass1 tc1;TestClass2 tc2;cout << "/**************************************************************************************/" << endl;Test t(tc1, tc2); }
运行结果为:
可以看到:仍然是TestClass1的构造函数先被调用,TestClass2的构造函数接着被调用。
结论:C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的,而与其在初始化列表中的顺序无关。
再举一个例子:
然后我将代码写成这样:
1 class Test 2 { 3 public: 4 Test() = default; 5 Test(TestClass1& tc1, TestClass2& tc2):m_tc2(tc2){} 6 private: 7 TestClass1 m_tc1; 8 TestClass2 m_tc2; 9 }; 10 11 int main() 12 { 13 TestClass1 tc1; 14 TestClass2 tc2; 15 cout << "/**************************************************************************************/" << endl; 16 Test t(tc1, tc2); 17 }
注意与之前代码的差别:我们在初始化列表中只初始化了m_tc2,没有动m_tc1。
运行结果:
结果分析:在初始化Test的对象t时,由于m_tc1的声明顺序在m_tc2的声明顺序之前,所以t会想要先初始化m_tc1,但是它在初始化列表中没有找到初始化m_tc1的内容,于是它只好调用m_tc1的默认构造函数了,完成m_tc1的初始化后,再根据初始化列表中的内容初始化m_tc2。
转载于:https://www.cnblogs.com/XiaoXiaoShuai-/p/11602011.html
C++中类成员变量在初始化列表中的初始化顺序相关推荐
- 1.c++中初始化列表和构造函数初始化的区别是什么?2.类的成员变量的初始化顺序是按照声明顺序吗?
初始化列表和构造函数初始化的区别是什么? 初始化和赋值对内置类型的成员没有太大的区别,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的.只有一些需要注意的事项 初始化列表一般情况如下: D ...
- 【c++】构造函数初始化列表中成员初始化的次序性
上代码 #include <iostream> using namespace std;class A {public:A(int v): j(v + 2), i(j) {}void pr ...
- C++经典问题:如果对象A中有对象成员B,对象B没有默认构造函数,那么对象A必须在初始化列表中初始化对象B?
对象成员特点总结: (1)实例化对象A时,如果对象A有对象成员B,那么先执行对象B的构造函数,再执行A的构造函数. (2)如果对象A中有对象成员B,那么销毁对象A时,先执行对象A的析构函数,再执行B的 ...
- C语言允许初始化列表中末尾出现多余的逗号
C语言允许初始化列表中出现多余的逗号,例如: int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, }; 为什么这种特性是有用的 ...
- 创建一个 Rectangle类,添加width和lenght两个成员变量 在 Rectangle类中添加两种方法分别计算矩形的周长和面积 编程利用Rectangle输出一个矩形的周长和面积
创建一个 Rectangle类,添加width和lenght两个成员变量 在 Rectangle类中添加两种方法分别计算矩形的周长和面积 编程利用Rectangle输出一个矩形的周长和面积 publi ...
- 90页第三题,创建一个 Rectangle类,添加width和lenght两个成员变量 在 Rectangle类中添加两种方法分别计算矩形的周长和面积 ,编程利用Rectangle输出一个矩形的
//90页第三题,创建一个 Rectangle类,添加width和lenght两个成员变量 //在 Rectangle类中添加两种方法分别计算矩形的周长和面积 //编程利用Rectangle输出一个矩 ...
- 变量在原型链中的查找顺序
js原型链 下面是一道js题目: [javascript] view plaincopy function C1(name){ if(name){ this.name = name; } } func ...
- C++成员变量初始化列表中初始化顺序
1.C++使用初始化列表初始化时,成员变量的初始化顺序:只与定义变量的顺序有关. #include <iostream> using namespace std; class A{ pri ...
- c语言结构体成员变量私有化,C语言中结构体变量私有化详解
C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...
最新文章
- unity 2d摄像机类型_Unity使用笔记2——功能介绍
- oracle技术之使用rman找回被误删除表空间
- UA OPTI570 量子力学 原子结构基础 公式与结论总结
- 开发:随笔记录之 Json字符串和对象的相互转换
- linux ndk编译so,有的APP NDK 编译的SO文件 无法调用 PackageManager
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明) Cities(区间dp)
- opencv python教程简书_OpenCV-Python系列二:常用的图像属性
- wlan端口服务器无响应,wlan项目遇到的问题,总结
- ANDROID框架揭秘
- 数据库范式(1 2 3 BCNF范式)详解
- 业务关键路径最小成本试错《精益创业》
- Mysql启动之报错:The server quit without updating PID file
- Windows Server2008 R2搭建域环境(步骤最详细)
- Scacanner类
- iwebshop分销商城系统具体有哪些优势?
- android友盟埋点,React Native 的友盟统计--打点/埋点
- 哎呦报错啦怎么办?nginx: [emerg] “server“ directive is not allowed here in /usr/local/nginx/conf/nginx.conf53
- 在线网页版鸡乐盒html源码
- 简简单单玩转CSS3(1)
- Oracle VPD
热门文章
- oracle dplsql.bsq,Oracle PLSQL语言初级教程之过程和函数
- mysql8.0.11创建用户报错_mysql8.0创建用户授予权限报错解决方法
- 卡耐基梅隆计算机学院,卡内基梅隆计算机学院--计算机系简介
- php垂直对齐,CSS垂直对齐不起作用的原因及解决方法
- Ado.Net 实体类、数据连接类、数据访问类
- Pixysoft.Framework.Noebe.Comets开发实录
- ShartPoin无法创建门户网站的问题
- php软件开发--oop(面向对象)
- bigdecimal 设置_BigDecimal 使用方法详解
- 手抄Threejs源码之Scene