我在理解C ++拷贝构造函数时遇到一些问题,希望有人能帮助我。
据我所知,当一个函数返回一个类的实例时,会调用复制构造函数(等等)。
#include <iostream>
using namespace std;
class Test
{
int a;
public:
Test(int a) : a(42)
{}
// Copy constructor
Test(const Test& other)
{
cout << "copy constructor" << endl;
}
};
Test test_function()
{
Test a(3);
return a;
}
int main()
{
test_function();
return 0;
}
那么,如果我执行此代码,复制构造函数永远不会被调用?为什么?还没有返回哪个对象?
此外,如果我更换行
test_function();
到
Test b = test_function();
复制构造函数既没有被调用 - 为什么不呢?
提前致谢
编辑: 将功能更改为:
Test test_function()
{
Test a(3);
Test b(34);
if (4 < 2)
return a;
else
return b;
}
可以看到复制构造函数调用,因为编译器无法使用RVO。
答案 0 :(得分:0)
Test test_function()
{
Test a(3);
return a;
}
此函数声明Test
的本地副本并将其返回。编译器将看到,意识到它将在创建新副本时销毁本地副本,并简单地将本地副本省略到结果。要查看您想要的结果,这可能会更好:
Test test_function(const Test& t)
{
return t;
}
int main()
{
Test t1;
Test t2 = test_function(t1);
return 0;
}
答案 1 :(得分:0)
它是(复制/移动)构造函数省略作为优化以避免不必要的复制/移动。可以应用另一个优化完全是忽略返回任何内容,因为你根本没有使用返回的值。
无论如何,您可以禁用此优化并查看此编译器开关(gcc)所需的消息:
-fno-elide-constructors
但是,使用上面的开关仅用于测试,并让优化适用于实际程序。