首先我们来看这么一个场景
/*********************** 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的拷贝构造函数