#include <iostream>
using namespace std;
class X
{
public:
X() { cout<<"default constructor"<<endl; }
X(const X&) { cout<<"copy constructor"<<endl; }
};
X test(X a)
{
X y = a;
return y;
}
int main()
{
X obj;
X obj1 = test(obj);
return 0;
}
输出:
default constructor
copy constructor
copy constructor
我编译了使用MinGw编译器。
但是,我认为输出是错误的。
通过值传递对象,按值返回或显式复制时,将调用复制构造函数。
在上面的程序中,"copy constructor"
必须被调用4次。
test(obj)
,将obj
复制到a
X y = a
,明确复制。return y
被调用,y
被复制到临时对象,让它成为temp
X obj1 = temp
,明确复制。请指正。提供你的理由......
答案 0 :(得分:3)
这是所谓的“返回值优化”的一个例子。
编译器注意到它必须将y
的值复制到obj1
,因此它不是按值返回并将其复制到obj1
,而是具有函数{{ 1}}直接写入test
。
答案 1 :(得分:1)
这是(N)RVO的示例,又名命名返回值优化。允许编译器在以下代码中删除副本:
X test(X a)
{
X y = a;
return y;
}
如果你写了这样的东西:
X test(X a)
{
X x = a;
X y = a;
return (true ? x : y);
}
(N)RVO不适用。