c ++中的构造函数和复制构造函数行为

时间:2014-03-08 18:12:33

标签: c++ constructor copy-constructor

我有以下代码:

#include <iostream>
using namespace std;

class X
{
public:
    int g;
    X() { cout << "constr" << endl; }
    X(const X& ref1) { cout << "copy constr" << endl; }
};

X f()
{
    X ee;
    ee.g = 1;
    return ee;
}

int main()
{
    X ff = f();
    return 0;
}

运行代码我看到构造函数只被调用一次,从未调用过复制构造函数。你不期望这里有两个构造函数和一个复制构造函数调用吗?谢谢!

2 个答案:

答案 0 :(得分:1)

这是名为copy elisionreturn value optimization的一个特例(该链接正好解释了您的情况)。

答案 1 :(得分:0)

复制Elision 是许多编译器实施的优化,以防止额外的,不必要的副本。在实践中可以实现按值返回或按值传递。

请查看以下答案中的示例:https://stackoverflow.com/a/12953129/1938163

struct C {
  C() {}
  C(const C&) { std::cout << "A copy was made.\n"; }
};

C f() {
  return C();
}

int main() {
  std::cout << "Hello World!\n";
  C obj = f();
}

http://en.wikipedia.org/wiki/Return_value_optimization#Summary

第一次相信可能不可思议,具体取决于编译器和放大器。设置,以下输出均有效:

Hello World! 
A copy was made. 
A copy was made. 

Hello World! 
A copy was made.

Hello World!

在您的情况下,这是一个名为RVO - Return Value Optimization的特殊复制省略优化,其中通过方法的值返回的对象的副本已被删除。