C ++ postfix ++运算符重载

时间:2013-06-15 08:47:48

标签: c++ operator-overloading

根据这个:Operator overloading

class X {
  X& operator++()
  {
    // do actual increment
    return *this;
  }
  X operator++(int)
  {
    X tmp(*this);
    operator++();
    return tmp;
  }
};

是实现++运算符的方法。第二个(后缀运算符)按值返回,而不是按引用返回。这很清楚,因为我们无法返回对本地对象的引用。因此,我们不是在堆栈上创建tmp对象,而是在堆上创建它并返回对它的引用。所以我们可以避免额外的副本。所以我的问题是,以下是否有任何问题:

class X {
  X& operator++()
  {
    // do actual increment
    return *this;
  }
  X& operator++(int)
  {
    X* tmp = new X(*this);
    operator++();
    return *tmp;
  }
};

3 个答案:

答案 0 :(得分:4)

调用者现在必须处理删除内存。

答案 1 :(得分:1)

如果您的目的是避免额外的副本,请记住可能没有额外的副本。 RVO会避免它 - 返回值将直接放入调用者的变量X中,从而优化副本。

答案 2 :(得分:1)

  

因此,我们不是在堆栈上创建tmp对象,而是在堆上创建它   并返回对它的引用。所以我们可以避免额外的副本。

根据RVO,大多数情况下没有额外的副本。 x内的值operator++直接向上移动为返回值。检查一下:

#include <iostream>

class X 
{
    public:

        X() {}
        X( const X & x ) {
            std::cout << "copy" << std::endl;
        }

        X& operator++()
        {
            // do actual increment
            return *this;
        }
        X& operator++(int)
        {
            X x;
            operator++();
            return x;
        }
};

int main()
{
    X x;
    x++;

    return 0;
}

没有副本(仅通过vc7测试)。但是,您的实现会在此行中进行复制:

X tmp(*this);

或在此:

X* tmp = new X(*this);