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. 简单快速破解IDEA

    ====================================2019.09.16更新==================================== 可以直接去掉第三步,直接在激活 ...

  2. 【转】Eclipse插件收藏列表

    使用了多年了Eclipse每个人都有自己的插件私藏列表,本系列文章会记录Eclipse市场推荐的个人私藏插件列表,希望对大家有帮助. 这一期的主人公是Zous Pantalons. viPlugin ...

  3. floj 2264

    2.公路建设(highway.c/cpp/pas) 在滨海市一共有n 个城市,编号依次为1到n,它们之间计划修建m条双向道路,其中修建第i条道路的费用为ci. 海霸王作为滨海市公路建设项目的总工程师, ...

  4. Android学习进度一

    在解决了电脑产生的一系列问题之后成功安装了Android Studio,并在其自带的手机模拟器上成功运行了第一个App(Hello World!),通过这个最简单的App研究了App基本的工程结构,为 ...

  5. Ambari下安装oozieUI界面无法访问问题

    前言: 其他集群管理工具安装oozie和手动编译安装oozie,关于oozie的UI界面无法访问的问题,大致和该方法类似. 找到下面4步骤里的视图显示的目录,有一个ext-2.2软链指向的路径 lrw ...

  6. FFT 入门

    推荐博客 :https://oi.men.ci/fft-notes/ 卷积的理解 : https://www.zhihu.com/question/22298352?rf=21686447 题目链接 ...

  7. Ansible Playbooks常用模块

    File模块 在目标主机创建文件或目录,并赋予其系统权限 - name: create a file file:'path=/oot/foo.txt state=touch mode=0755 own ...

  8. ASP.NET 开源导入导出库Magicodes.IE 导出Pdf教程

    基础教程之导出Pdf收据 说明 本教程主要说明如何使用Magicodes.IE.Pdf完成Pdf收据导出 要点 导出PDF数据 自定义PDF模板 导出单据 如何批量导出单据 导出特性 PdfExpor ...

  9. Django 添加 app

    一.创建Django项目的时候添加 二.在终端创建app python manage.py startapp app名称 运行完命令后,要在settings.py文件中,添加配置文件

  10. windows下配置tomcat的虚拟路径编译器为IDEA

    在tomcat中配置好后发现运行项目还是无效 我们需要打开tomcat的配置,把下方的红色区域勾选上即可生效 具体原因如下 那是由于默认时IDEA的热部署机制,会在以下路径: [C:\Users\系统 ...