复制构造函数错误地调用

时间:2013-12-19 15:02:01

标签: c++ copy-constructor

#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次。

    调用
  1. test(obj),将obj复制到a
  2. 调用
  3. X y = a,明确复制。
  4. return y被调用,y被复制到临时对象,让它成为temp
  5. X obj1 = temp,明确复制。
  6. 请指正。提供你的理由......

2 个答案:

答案 0 :(得分:3)

这是所谓的“返回值优化”的一个例子。

编译器注意到它必须将y的值复制到obj1,因此它不是按值返回并将其复制到obj1,而是具有函数{{ 1}}直接写入test

请参阅http://en.wikipedia.org/wiki/Return_value_optimization

答案 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不适用。