复制构造函数未调用?

时间:2010-06-21 12:49:09

标签: c++ constructor copy

class X
{
  int i;  
  public:
  X(int m) : i(m) {};

  X(const X& x)
  {
    //cout "copy constructor is called\n";
  }

  const X opearator++(X& a,int)
  {
     //cout "X++ is called\n";
     X b(a.i);
     a.i++;
     return b;
  }
  void f(X a)
  {   }
};

 int main()
{ 
  X a(1);
  f(a);
  a++; 
  return 0;
}

这里调用函数'f'时,复制构造函数按预期调用。在++的情况下,调用operator ++函数,但是当它返回“不调用复制构造函数”时。 为什么“从函数'运算符++'返回时没有调用复制构造函数?

6 个答案:

答案 0 :(得分:11)

我相信您遇到了返回值优化(RVO) http://en.wikipedia.org/wiki/Return_value_optimization

答案 1 :(得分:7)

每个C ++程序员都必须阅读全网络着名的C ++ FAQ Lite(例如,here)。

你的问题可能与那个问题相对应:
[10.9] Does return-by-value mean extra copies and extra overhead?

答案 2 :(得分:3)

当从函数返回对象时,允许编译器忽略对复制构造函数的调用。

也就是说,不需要实际调用复制构造函数:它只需构造要在函数返回对象所需的任何位置返回的对象。

答案 3 :(得分:2)

看起来像RVO(返回值优化)。您的编译器发现您没有对“b”实例执行任何操作,也没有对其返回的副本执行任何操作,因此会从编译的输出中删除它(对象复制操作)。

答案 4 :(得分:0)

即使复制构造函数有副作用,也可以合法复制副本。它被称为RVO(还有一个用于命名(评论:谢谢)值,NRVO)并且标准明确允许这样做。

答案 5 :(得分:0)

嗯,你的代码中有几处错误。如果您编译并运行我附加的代码,您将看到当operator ++返回时成功调用了复制构造函数。

#include <iostream>

class X {
public:
    X(int m) : i(m) {};

    X(const X& x)
    {
        std::cout << "Copy constructor is called\n";
    }

    X
    operator++(int)
    {
        std::cout << "X++ is called\n";

        this->i++;
        return *this;
    }


private:
    int i;

};


void
f(X a)
{
}


int
main(void)
{
    X a(1);
    f(a);
    a++;
    return 0;
}