考虑以下示例:
#include <iostream>
using namespace std;
class Test{
public:
int a;
Test(int a=0):a(a){ cout << "Ctor " << a << endl;}
Test(const Test& A):a(A.a){ cout << "Cpy Ctor " << a << endl;}
Test operator+ ( Test A){
Test temp;
temp.a=this->a + A.a;
return temp;
}
};
int main()
{
Test b(10);
Test a = b ;
cout << a.a << endl;
return 0;
}
输出是:
$ ./Test
Ctor 10
Cpy Ctor 10
10
它调用Copy构造函数。现在,假设我们将代码修改为:
int main()
{
Test b(10);
Test a = b + Test(5);
cout << a.a << endl;
return 0;
}
输出变为:
$ ./Test
Ctor 10
Ctor 5
Ctor 0
15
表达式Test a = b + Test(5);
不会调用复制构造函数。我认为b+ Test(5)
应该用于实例化a
类型的新对象Test
,所以这应该调用复制构造函数。有人可以解释输出吗?
由于
答案 0 :(得分:2)
请参阅copy elision:http://en.wikipedia.org/wiki/Copy_elision
基本上,没有构造临时值,结果直接放入测试对象。</ p>