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:函数只能被定义一次,要么在函数内,要么在函数外。使用初始化列表初始化时必须定义函数!

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

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

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

  2. 4.给定一个正整数m,统计m的位数,分别打印每一位数字,再按照逆序打印出各位数字。 要求:m定义为类的属性,需定义构造函数为m赋值;当m大于99999时,输出错误信息“the number is too large”,不再执行。

    package a; public class ShuZi { int m; public int getM() { return m; } public void setM(int m) { thi ...

  3. c++ 关于类构造函数的初始化列表

    除了性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型,引用必须在定义的时候初始化,并且不能重 ...

  4. C++类够做函数初始化列表

    构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample{ public: int a; float b; C ...

  5. C++学习之路(十一):C++的初始化列表

    结论: 1.在C++中,成员变量的初始化顺序与变量在类型中的声明顺序相同,而与他们在构造函数的初始化列表中的顺序无关. 2.构造函数分为两个阶段执行:1)初始化阶段:2)普通的计算阶段,表现为赋值操作 ...

  6. c++,初始化列表

    类对象的构造顺序是这样的: a.分配内存,调用构造函数时,隐式/显示的初始化各数据成员 b.进入构造函数后在构造函数中执行一般计算 1.初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内 ...

  7. C++ 初始化列表(转)

    转载自:http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html 何谓初始化列表 与其他函数不同,构造函数除了有名字,参数列表和函 ...

  8. C++初始化列表(good)

    本文转载自http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html 感谢作者分享 何谓初始化列表 与其他函数不同,构造函数除了有名 ...

  9. 【校招面试 之 C/C++】第1题 为什么优先使用构造函数的初始化列表

    1.首先看一个例子: #include<iostream> using namespace std; class Test1 { public: Test1() // 无参构造函数 { c ...

随机推荐

  1. X-Admin&ABP框架开发-租户管理

    软件即服务概念的推动,定制化到通用化的发展,用一套代码完成适应不同企业的需求,利用多租户技术可以去做到这一点.ABP里提供了多租户这一概念并且也在Zero模块中实现了这一概念. 一.多租户的概念 单部 ...

  2. Linux下Docker的安装与使用

    yum安装Docker最新版和docker-compose(超级简单的安装方法) Install Docker 首先安装依赖 yum install -y yum-utils device-mappe ...

  3. [转载] Windows系统批处理延迟方法

    小贴士:方法四 亲测有效,因为当时对于精确度要求不是很高,所以没有具体测试它的精确度.其他方法没有测过,用到的时候再测吧! 批处理延时启动的几个方法 方法一:ping 缺点:时间精度为1秒,不够精确 ...

  4. spring-boot内嵌三大容器https设置

    spring-boot内嵌三大容器https设置 spring-boot默认的内嵌容器为tomcat,除了tomcat之前还可以设置jetty和undertow. 1.设置https spring-b ...

  5. Android 平台JS调试技术

    1.  测试技术简介 Android平台微信公众号一般以H5的形式开发,测试发现流量一般都通过js进行加密传输,导致无法对越权.SQL注入等风险点进行测试.针对此难点,本手册会介绍包括Android环 ...

  6. 一文熟练使用python mock

    mock作为python测试模拟对象工具,在单元测试当中使用较多,官方文档详细不够精简,这篇文章介绍mock常用的用法,以下为引用全文,留给自己和有需要的人查阅. https://realpython ...

  7. MongoDB数据库备份和恢复

    1.数据库备份 mogodbdump -h dbhost -d dbname -o dbdirectory -h: 服务器地址,也可以指定端口号 -d: 需要备份的数据库的名称 -o: 备份的数据库存 ...

  8. context:component-scan标签的诠释

    XML中配置context:component-scan时,spring会自动的扫描这个包下被这些注解标识的类@Component,@Service,@Controller,@Repository,同 ...

  9. 【java面试】网络通信篇

    1.说一下HTTP协议 HTTP协议是超文本传输协议,属于应用层协议,规定了客户端与服务端传输数据的格式:它是无状态的,对于前面传送过的信息没有记录:请求方式有GET,POST,HEAD,PUT,DE ...

  10. selenium,xpath路径中引入变量

    比如,我需要获取每一条微博的阅读数,总不可能所有微博都找出xpath,然后获取阅读数 找规律 “//*[@id='Pl_Official_MyProfileFeed__20']/div/div[2]/ ...