要解决这个问题,我们首先来看下面这个例子:这个程序运行会调用几次拷贝构造?
#include <iostream>
using namespace std;
class Widget
{
public:
Widget()//构造函数
{
//cout << "Widget()" << endl;
}
Widget(const Widget&)//拷贝构造
{
cout << "Widget(const Widget&)" << endl;
}
};
Widget f(Widget u)
{
return u;
}
int main()
{
Widget x;
f(x);
return 0;
}
这个很容易理解,调用f(x),传值传参会形成临时变量,拷贝构造一次,返回时又会形成临时变量,又会拷贝构造一次,所以是两次。
那么此时我们拿一个变量y来接收,又会拷贝构造几次呢?
画图分析:
运行程序:
这是为什么呢?
一次调用里面,连续构造函数,会被编译器优化,合二为一。
C++标准并没有规定是否要做这个优化,是否要做这个优化要看具体的编译器,不过现在的编译器基本都做了。
再回到这个题:
再画图分析:
运行程序: