引子:我们知道,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. 1.c++中初始化列表和构造函数初始化的区别是什么?2.类的成员变量的初始化顺序是按照声明顺序吗?

    初始化列表和构造函数初始化的区别是什么? 初始化和赋值对内置类型的成员没有太大的区别,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的.只有一些需要注意的事项 初始化列表一般情况如下: D ...

  2. 【c++】构造函数初始化列表中成员初始化的次序性

    上代码 #include <iostream> using namespace std;class A {public:A(int v): j(v + 2), i(j) {}void pr ...

  3. C++经典问题:如果对象A中有对象成员B,对象B没有默认构造函数,那么对象A必须在初始化列表中初始化对象B?

    对象成员特点总结: (1)实例化对象A时,如果对象A有对象成员B,那么先执行对象B的构造函数,再执行A的构造函数. (2)如果对象A中有对象成员B,那么销毁对象A时,先执行对象A的析构函数,再执行B的 ...

  4. C语言允许初始化列表中末尾出现多余的逗号

    C语言允许初始化列表中出现多余的逗号,例如: int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, }; 为什么这种特性是有用的 ...

  5. 创建一个 Rectangle类,添加width和lenght两个成员变量 在 Rectangle类中添加两种方法分别计算矩形的周长和面积 编程利用Rectangle输出一个矩形的周长和面积

    创建一个 Rectangle类,添加width和lenght两个成员变量 在 Rectangle类中添加两种方法分别计算矩形的周长和面积 编程利用Rectangle输出一个矩形的周长和面积 publi ...

  6. 90页第三题,创建一个 Rectangle类,添加width和lenght两个成员变量 在 Rectangle类中添加两种方法分别计算矩形的周长和面积 ,编程利用Rectangle输出一个矩形的

    //90页第三题,创建一个 Rectangle类,添加width和lenght两个成员变量 //在 Rectangle类中添加两种方法分别计算矩形的周长和面积 //编程利用Rectangle输出一个矩 ...

  7. 变量在原型链中的查找顺序

    js原型链 下面是一道js题目: [javascript] view plaincopy function C1(name){ if(name){ this.name = name; } } func ...

  8. C++成员变量初始化列表中初始化顺序

    1.C++使用初始化列表初始化时,成员变量的初始化顺序:只与定义变量的顺序有关. #include <iostream> using namespace std; class A{ pri ...

  9. c语言结构体成员变量私有化,C语言中结构体变量私有化详解

    C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...

最新文章

  1. unity 2d摄像机类型_Unity使用笔记2——功能介绍
  2. oracle技术之使用rman找回被误删除表空间
  3. UA OPTI570 量子力学 原子结构基础 公式与结论总结
  4. 开发:随笔记录之 Json字符串和对象的相互转换
  5. linux ndk编译so,有的APP NDK 编译的SO文件 无法调用 PackageManager
  6. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明) Cities(区间dp)
  7. opencv python教程简书_OpenCV-Python系列二:常用的图像属性
  8. wlan端口服务器无响应,wlan项目遇到的问题,总结
  9. ANDROID框架揭秘
  10. 数据库范式(1 2 3 BCNF范式)详解
  11. 业务关键路径最小成本试错《精益创业》
  12. Mysql启动之报错:The server quit without updating PID file
  13. Windows Server2008 R2搭建域环境(步骤最详细)
  14. Scacanner类
  15. iwebshop分销商城系统具体有哪些优势?
  16. android友盟埋点,React Native 的友盟统计--打点/埋点
  17. 哎呦报错啦怎么办?nginx: [emerg] “server“ directive is not allowed here in /usr/local/nginx/conf/nginx.conf53
  18. 在线网页版鸡乐盒html源码
  19. 简简单单玩转CSS3(1)
  20. Oracle VPD

热门文章

  1. oracle dplsql.bsq,Oracle PLSQL语言初级教程之过程和函数
  2. mysql8.0.11创建用户报错_mysql8.0创建用户授予权限报错解决方法
  3. 卡耐基梅隆计算机学院,卡内基梅隆计算机学院--计算机系简介
  4. php垂直对齐,CSS垂直对齐不起作用的原因及解决方法
  5. Ado.Net 实体类、数据连接类、数据访问类
  6. Pixysoft.Framework.Noebe.Comets开发实录
  7. ShartPoin无法创建门户网站的问题
  8. php软件开发--oop(面向对象)
  9. bigdecimal 设置_BigDecimal 使用方法详解
  10. 手抄Threejs源码之Scene