构造函数是在对象创建的时候调用的,拷贝构造函数是用已经建立好的对象来初始化新对象,那么拷贝构造函数在什么情况下还可以调用呢?
1,对象作为参数以值传递形式传入函数体;
2,对象作为返回值一值传递形式从函数体返回。
那么重点来了。。。编译器进行优化是在什么情况下呢?没错,就是基于以上两种情况。
下面根据实例详细说明:
Test1中调用了 2 次AA的拷贝构造函数, 1 次AA的赋值运算符函数的重载。
a1拷贝构造a,系统会将a拷贝构造到临时变量进行返回,由于这里a1是提前创建好的,编译器没有进行优化。
Test2中调用了 2 次AA的拷贝构造函数, 0 次AA的赋值运算符函数的重载。
a1拷贝构造a,这里会创建一个临时变量,返回的时候也是将a拷贝构造到一个临时变量,然后a2是一个连续赋值,编译器会将创建临时变量的两次拷贝构造优化
Test3中调用了 3 次AA的拷贝构造函数, 0 次AA的赋值运算符函数的重载。
class Date
{
public:
Date()
{
cout << "构造函数" << endl;
}
Date(const Date& d)
{
cout << "拷贝构造函数" << endl;
}
Date& operator =(const Date& d)
{
cout << "赋值运算符的重载" << endl;
return *this;
}
~Date()
{
cout << "析构函数" << endl;
}
};
一> Date()对象做参数以传值的方式或传引用的方式
1.Date()对象以传值的方式做参数
void fun1(Date d)
{}
//调用
Date d1;
fun1(d1);
void fun1(Date d)
{}
//调用
fun1(Date());
2.Date()对象以传引用的方式做参数
void func1(Date& d)
{}
//调用
Date d1;
func1(d1);
一>Date对象做返回值以传参方式和传引用方式
1.Date()对象以传值的方式做返回值
Date fun2()
{
Date d;
return d;
}
Date d2 = fun2();
2.Date()对象以传引用的方式做返回值
Date& func2()
{
Date d;
return d;
}
Date d2 = func2();
一>Date对象做临时返回值以传参和传引用的方式
1.Date()对象以传值的方式做临时返回值
Date fun3()
{
return Date();
}
Date d3;
d3 = fun3();
2.Date()对象以传引用的方式做临时返回值
Date& func3()
{
return Date();
}
Date d3;
d3 = func3();