0
点赞
收藏
分享

微信扫一扫

类内对象初始化时,为什么最好把对象的初始化放在初始化列表?

十里一走马 2022-03-24 阅读 121
c++

首先我们来看这么一个场景

/*********************** Test类 ***********************/
class Test
{
public:
	Test()
	{
		cout << "Test类调用默认构造函数" << endl;
	}
};

/*********************** Date类 ***********************/
class Date
{
private:
	Test _test;    //Test类的对象
public:

	Date()            //默认构造函数
	{
	}

	Date(Test& test)  //含参构造函数      
	{
		_test = test;     
	}
};

/*********************** main函数 ***********************/
int main() {
	Test t1;            //创建Test类的对象,同时会调用默认构造函数
	Date d(t1);        //创建Date类的对象,调用Date类的含参构造函数

	return 0;
}

一、测试结果分析

我们会发现,Test的构造函数被调用了两次

第一次调用,很容易知晓,那就是 main函数 中Test创建对象的时候,调用了 一次 默认构造函数

 第二次调用在哪??

编译器在编译的时候,调用的构造函数  会隐式自动生成一个初始化列表(如下)

这个时候,_test对象会被无参初始化,然后会调用默认构造函数

二、优化:直接在初始化列表初始化,而不是在构造函数内部初始化

经过前面的分析,我们知道,构造函数在调用的时候默认会生成初始化列表

所以我们只需要改动下面所展示的一部分

                       

 

 现在的测试结果是

 这里本质上是 调用Test的默认构造函数 变成了  调用Test的拷贝构造函数

举报

相关推荐

0 条评论