构造函数采用初始化列表进行初始化时,成员变量的初始化顺序(与声明顺序有关)

最近学C++的时候一直很迷惑,特别是组合类的构造函数的执行顺序,一直都让我很头疼(下一篇博客再分享吧),在这里和大家分享一下,顺便写的有不对的地方,欢迎大家批评指正。

test1

#include<cstdio>
#include<iostream>
#include<algorithm>using namespace std;class Point{private:int m_x;int m_y;
public:Point() : m_x(1), m_y(m_x + 1){cout << "Point的初始化列表构造调用" << m_x << " " << m_y << endl;}~Point(){cout << "Point的析构函数调用" << m_x << " " << m_y << endl;}Point(Point &p){m_x = p.m_x; m_y = p.m_y;cout << "Point的拷贝构造调用" << m_x << " " << m_y << endl;}int getX(){return m_x;}int getY(){return m_y;}
};int main(){int i, j, k;Point p1;return 0;
}

执行结果如下:

可以看到m_x、m_y按照我们预想的结果进行了初始化,输出结果符合预期。
接下来我们将私有变量m_x、m_y的声明顺序调换一下,看看结果会是怎样。

test2

#include<cstdio>
#include<iostream>
#include<algorithm>using namespace std;class Point{private:int m_y;int m_x;
public:Point() : m_x(1), m_y(m_x + 1){cout << "Point的初始化列表构造调用" << m_x << " " << m_y << endl;}~Point(){cout << "Point的析构函数调用" << m_x << " " << m_y << endl;}Point(Point &p){m_x = p.m_x; m_y = p.m_y;cout << "Point的拷贝构造调用" << m_x << " " << m_y << endl;}int getX(){return m_x;}int getY(){return m_y;}
};int main(){int i, j, k;Point p1;return 0;
}

执行结果如下:

可以看到,m_y的值并不是2,这就是因为初始化顺序的问题,导致了m_y的值并不和我们预想的结果一样。

总结

类的成员变量在使用初始化列表进行初始化时,成员变量的初始化顺序与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关

从test1中可以看到,我们先声明了变量m_x,后声明了变量m_y,所以通过初始化列表进行初始化时会先初始化m_x,后初始化m_y,这样就符合我们的预期(即先有m_x = 1; 后执行m_y = m_x + 1; 于是有m_x = 1; m_y = 2)。

而对于test2而言,由于我们先声明的m_y,后声明的m_x,所以会先初始化m_y,后初始化m_x(即先有m_y = m_x + 1; 后执行m_x = 1; 于是有m_x = 1; m_y的值不定)。

构造函数初始化列表初始化成员变量的顺序相关推荐

  1. C++ 初始化列表初始化列表性能问题的简单的探索

    C++ 初始化列表性能问题的简单的探索 从概念上来讲,构造函数的执行可以分成两个阶段,初始化阶段和计算阶段,初始化阶段先于计算阶段. 在执行构造函数时,如果没有给定初始值,那系统就会自动进行初始化. ...

  2. java 成员变量声明顺序_C++核心准则讨论:按照成员声明的顺序定义和初始化成员变量...

    Discussion: Define and initialize member variables in the order of member declaration 讨论:按照成员声明的顺序定义 ...

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

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

  4. java静态代码块、静态方法、静态变量、构造代码块、普通代码块、成员变量执行顺序

    package smartt.styy.auth.model.voRsp;public class Test {static {String test5="555";//局部变量t ...

  5. C++成员初始化列表

    C++类成员初始化列表 C++类型定义 C++构造函数的初始化列表定义 C++构造函数执行的两个阶段:初始化阶段和计算阶段 为什么使用初始化列表 C++里面哪些东西必须放在初始化列表里面 成员变量的初 ...

  6. 初始化列表的使用(十五)

    我们之前在 C 语言中可以定义 const 成员,那么我们是否可以在类中定义 const 成员呢?我们来看看下面代码中的类定义是否合法呢?如果合法,ci 的值是什么,存储在哪里呢? #include ...

  7. C++中初始化列表的使用

    文章目录 1 C++中初始化列表的使用 1.1 类成员的初始化 1 C++中初始化列表的使用 1.1 类成员的初始化 C++中提供了初始化列表对成员变量进行初始化. 语法规则: 注意事项: 成员的初始 ...

  8. 【深入理解】初始化列表

    目录 一.什么是初始化列表? 二.初始化列表长啥样? 三.初始化列表的特性 1.由于是在定义阶段进行的初始化,所以,只能在定义阶段进行的初始化类型便只能在初始化列表中进行初始化. 2.初始化顺序不是跟 ...

  9. C++ 初始化列表详解

    目录 1.什么是初始化列表 2.什么时候需要使用初始化列表? 3.初始化列表的效率 4.初始化列表的初始化顺序 1.什么是初始化列表 class A { public:A(int value):m_d ...

最新文章

  1. vscode创建工作区_区领导调研工业区高楼村乡村振兴示范村创建工作!
  2. laravel实现读写分离
  3. 关于微信 setData 回调函数中的坑
  4. python 库整理:toolz.curried (整理中)
  5. ant接口自动化 junit_Jenkins + Ant自动运行Junit测试
  6. 【Linux系统编程】线程堆栈大小的使用介绍
  7. 台式计算机视频设备打不开,电脑视频设备被占用未能创建视频预览怎么办
  8. 音视频之hls rtmp rtsp 视频流测试地址
  9. 衰退的爱立信,进击的华为
  10. android av和hdmi输出切换代码,AV转HDMI转换器有用吗?
  11. 免越狱版 iOS 抢红包插件
  12. python电力系统暂态分析_电力系统暂态计算——时域仿真方法
  13. BankNext 微服务:案例研究
  14. xml 解析库 msxml6.dll
  15. 指令集并行——vliw和超标量cpu
  16. 微软网盘SkyDrive简单一步获取mp3外链的方法
  17. linux设置字符编码gbk,CentOS修改默认字符编码为GBK
  18. 聚焦时代起点 智启云上未来——IMPACT2018紫光云峰会在津举办
  19. win7系统下安装LINUX系统教程
  20. R语言 Hurst指数计算

热门文章

  1. android收藏功能demo,Android使用Realm数据库实现App中的收藏功能(代码详解)
  2. sv中program和module区别
  3. ureport2 vue版本实现
  4. ifame 实现页面预载,页面不闪(load)
  5. 相邻位数字差值的绝对值不能超过77_微信小程序直播怎么用和挣钱?4位内测CEO答5大关键问题...
  6. Algorand 系列一:VRF 密码学抽签原理及其在 Algorand 中的应用
  7. 机器学习中,什么是线性和非线性?
  8. 2018六校联合周赛上学期第一场-我来爆零啦 寻找中位数 kth
  9. Spring学习中使用javaConfig进行配置时出现 has not been refreshed yet错误
  10. git: cherry-pick