case 1:在类外定义构造函数,所有data member都在初始化列表中进行初始化。

class SupportClass
{
public:SupportClass(){cout << "SupportClass() is called" << endl;}SupportClass(SupportClass&){cout << "SupportClass(SupportClass&) is called" << endl;}~SupportClass(){cout << "~SupportClass() is called" << endl;}SupportClass& operator=(SupportClass&){cout << "SupportClass()& operator=(SupportClass&) is called" << endl;return *this;}
};class TestInitialize
{
public:TestInitialize(SupportClass arg);
private:SupportClass data;
};TestInitialize::TestInitialize(SupportClass arg) :data(arg){}int main()
{SupportClass sc;cout << endl;TestInitialize ti(sc);return 0;
}

  

结果:

第一次默认构造:来自main函数中定义的变量sc;

第二次拷贝构造:来自形参拷贝实参;

第三次拷贝构造:来自data member 拷贝形参。

结论:与类内定义一样。

case 2:在类外定义构造函数,初始化列表为空,data member 在函数体中定义。

TestInitialize::TestInitialize(SupportClass arg) { data = arg; }

  结果;

第一次默认构造:来自main函数中定义的变量sc;

第二次拷贝构造:来自形参拷贝实参;

第三次默认构造:来自data member 的默认初始化。

接着的 operator=:data 复制 形参。

结论:与类内定义一样。

case 3:类有多个 data 成员,全用初始化列表初始化,函数体为空

添加一个class:AnotherClass

class AnotherSupportClass
{
public:AnotherSupportClass(){cout << "AnotherSupportClass() is called" << endl;}AnotherSupportClass(AnotherSupportClass&){cout << "AnotherSupportClass(AnotherSupportClass&) is called" << endl;}~AnotherSupportClass(){cout << "~AnotherSupportClass() is called" << endl;}AnotherSupportClass& operator=(AnotherSupportClass&){cout << "AnotherSupportClass()& operator=(AnotherSupportClass&) is called" << endl;return *this;}
};

TestInitialize::TestInitialize(SupportClass arg1, AnotherSupportClass arg2)
:data(arg1), anotherData(arg2){}

 结果:

意外发现:

我的构造函数的参数列表是:先SupportClass,然后再AnotherSupportClass。

结果在由实参拷贝到形参时时:先AnotherSupportClass,再SupportClass。

又做了一个实验:再添加一个成员

class TestInitialize
{
public:TestInitialize(SupportClass arg1, AnotherSupportClass arg2,OtherSupportClass arg3);
private:SupportClass data;AnotherSupportClass anotherData;OtherSupportClass otherData;
};TestInitialize::TestInitialize(SupportClass arg1, AnotherSupportClass arg2, OtherSupportClass arg3)
:data(arg1), anotherData(arg2),otherData(arg3){};

依旧是逆序拷贝构造的,重点是我不信邪,循环了100次,都是这个结果。

结论:函数参数列表的拷贝是随机的,并不是按照参数出现的先后顺序。

case 4:函数只能被定义一次,要么在函数内,要么在函数外。使用初始化列表初始化时必须定义函数!

转载于:https://www.cnblogs.com/XiaoXiaoShuai-/p/11498823.html

c++利用初始化列表在类内部和类外部定义构造函数的区别相关推荐

  1. Linux shell 内部命令与外部命令有什么区别以及怎么辨别

    内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留 ...

  2. hive中内部表和外部表有什么区别?一般什么时候使用内部表什么时候使用外部表?

    hive中内部表和外部表有什么区别? 在使用hive搭建数据仓库的时候,可以建立两种表格.一种是内部表(managed table),一种是外部表(external table). 内部表建表是不加修 ...

  3. C++类和对象成员函数,静态成员,构造函数和析构函数、初始化列表

    类和对象 数据成员的访问 定义成员函数 调用成员函数 私有成员函数 构造函数和析构函数 构造函数成员初始化列表 在构造函数中使用new的注意事项 this指针 const成员函数 运算符重载 友元函数 ...

  4. C++ 类(构造函数的成员初始化列表)

    文章概述 构造函数的成员初始化列表 构造函数的成员初始化列表 下面的代码分析了什么时候使用成员初始化列表: class A {private:int a;public:A(int a){this-&g ...

  5. C++ 构造函数初始化列表

    <C++ Primer>中提到在以下三种情况下需要使用构造函数初始化列表: 需要初始化的类的成员变量是对象的情况: 需要初始化的类的成员变量由const修饰的或初始化的类的引用成员变量: ...

  6. C++ 语法之【成员初始化列表】

    C++ 语法之[成员初始化列表] 类对象构造过程 定义[成员初始化列表] 必须使用[成员初始化列表]的情况 情况一:const类成员或者被声明为引用的类成员 情况二:初始化成员是对象(包含继承) 情况 ...

  7. C++必须使用【初始化列表】初始化数据成员的三种情况

    类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员: 2.进入构造函数后在构造函数中执行一般赋值与计算. 使用初始化列表有两个原因: 原因1.必须这样做: < ...

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

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

  9. 对象的初始化列表const变量的初始化

    当B类中有A类并且A类还有自己的有参数构造函数的时候,那这时若是B再使用默认构造函数就不能使用了,因为B不能对A进行初始化: #include <iostream> using names ...

最新文章

  1. l-lsblk查看设备可用块设备
  2. Windows Server 2016 + Exchange 2016 +Office365混合部署(四)
  3. eclipse部署的web项目没有添加到Tomcat的webapps目录下解决方法
  4. 河北计算机辅助普通话试题,115-河北省计算机辅助普通话水平测试培训.pptx
  5. python是否安装oracle接口,python安装oracle扩展及数据库连接方法
  6. Eclipse的Mockito模板
  7. 设树采用孩子兄弟表示法存放.用类c语言设计算法计算树的高度.,(数据结构课程设计分类题目.doc...
  8. 狐智、狼道、鹰谋,教你做个聪明的生存者!
  9. asp上传服务器后台图片显示,asp.net上传图片到服务器方法详解
  10. JSP基础教程【1】
  11. js柯里化的认识(本文转载自https://www.zhangxinxu.com/wordpress/2013/02/js-currying),觉得很有用就记下了
  12. 20145212 罗天晨 信息搜集与漏洞扫描
  13. 如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,求这个队列中从队列投到队列尾的元素个数(包含队列头、队列尾)。
  14. centos安装jq
  15. android 使用SAF框架操作外置sd卡
  16. GitHub标星8k,安卓最牛教材
  17. 《操作系统-真象还原》11. 用户进程
  18. c语言程序设计提纲,C语言程序设计”期末考试复习提纲
  19. 北京市通信管理局关于29款问题App的通报
  20. Revit API: DWG翻模的基本原理

热门文章

  1. android 美颜进度条,使用腾讯会议开会时如何开美颜?简单五步轻松实现!
  2. ubuntu15.04 php版本,在ubuntu下安装php版本问题
  3. matlab 矩阵列乘系数,matlab 给某一列乘上一个系数
  4. JDK1.8 String常量池详解
  5. 人智化转型 华为云微认证带你实力进阶
  6. sql server 查询本周、本月所有天数的数据
  7. 《Head.First设计模式读书笔记》之设计原则一、二和三
  8. Android安全之应用签名验证
  9. #pragma once 和 #ifndef ... #define ... #endif 的区别
  10. 用oracle的java存储过程实现BLOB字段的字符串读取