c++利用初始化列表在类内部和类外部定义构造函数的区别
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++利用初始化列表在类内部和类外部定义构造函数的区别的更多相关文章
- Linux shell 内部命令与外部命令有什么区别以及怎么辨别
内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留 ...
- 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 ...
- c++ 关于类构造函数的初始化列表
除了性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型,引用必须在定义的时候初始化,并且不能重 ...
- C++类够做函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample{ public: int a; float b; C ...
- C++学习之路(十一):C++的初始化列表
结论: 1.在C++中,成员变量的初始化顺序与变量在类型中的声明顺序相同,而与他们在构造函数的初始化列表中的顺序无关. 2.构造函数分为两个阶段执行:1)初始化阶段:2)普通的计算阶段,表现为赋值操作 ...
- c++,初始化列表
类对象的构造顺序是这样的: a.分配内存,调用构造函数时,隐式/显示的初始化各数据成员 b.进入构造函数后在构造函数中执行一般计算 1.初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内 ...
- C++ 初始化列表(转)
转载自:http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html 何谓初始化列表 与其他函数不同,构造函数除了有名字,参数列表和函 ...
- C++初始化列表(good)
本文转载自http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html 感谢作者分享 何谓初始化列表 与其他函数不同,构造函数除了有名 ...
- 【校招面试 之 C/C++】第1题 为什么优先使用构造函数的初始化列表
1.首先看一个例子: #include<iostream> using namespace std; class Test1 { public: Test1() // 无参构造函数 { c ...
随机推荐
- ACM北大暑期课培训第八天
今天学了有流量下界的网络最大流,最小费用最大流,计算几何. 有流量下界的网络最大流 如果流网络中每条边e对应两个数字B(e)和C(e), 分别表示该边上的流量至少要是B(e),最多 C(e),那么,在 ...
- 【转】最简单的安装pip的方法
网上有各种方法安装pip,针对不同的系统方法还不一样,最后发现还是下面这种方法最简单,直接了当干脆方便,适用于Windows和Linux. (1)下载pip 进入https://pypi.python ...
- 【转】线性插值(Linear Interpolation)基本原理
转:https://blog.csdn.net/u010312937/article/details/82055431 今天在阅读大牛代码的时候,发现了Linear Interpolation一次,百 ...
- es lucene搜索及聚合流程源码分析
本文以TermQuery,GlobalOrdinalsStringTermsAggregator为例,通过代码,分析es,lucene搜索及聚合流程.1:协调节点收到请求后,将search任务发到相关 ...
- [Debug]IOS微信浏览器不支持form表单的target=_blank
测试代码如下 <?php echo '<meta name="viewport" content="width=device-width,minimum-sc ...
- Fibnoccia 数列简单题
In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, ...
- Redis 分布式锁的正确实现方式( Java 版 )
前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...
- 算法笔记codeup-Contest100000568
A #include <stdio.h> int main() { ; ; while(a) { sum=sum+a; a--; } printf("%d",sum); ...
- msi通过powershell安装、卸载
function install_msi($url) { $telemetry = @{ DisplayName = "Telemetry Service"; filename = ...
- Java入门 - 面向对象 - 02.重写与重载
原文地址:http://www.work100.net/training/java-override-overload.html 更多教程:光束云 - 免费课程 重写与重载 序号 文内章节 视频 1 ...