4

我正在学习 C++ 中的运算符重载。原始后缀 ++ 的属性是它的优先级低于赋值运算符。例如,int i=0, j=0; i=j++; cout<<i<<j将输出 01。但是当我重载后缀 ++ 时,这个属性似乎丢失了。

#include<iostream>
using namespace std;

class V
{
public:
    int vec[2];
    V(int a0, int a1)
    {
        vec[0]=a0;vec[1]=a1;
    }
    V operator++(int dummy)
    {
        for(int i=0; i<2; i++)
        {
            ++vec[i];
        }
        V v(vec[0],vec[1]);
        return v;
    }
    V operator=(V other)
    {
        vec[0]=other.vec[0];
        vec[1]=other.vec[1];
        return *this;
    }
    void print()
    {
        cout << "(" << vec[0] << ", " << vec[1] << ")" << endl;
    }
};

int main(void)
{
    V v1(0,0), v2(1,1);
    v1.print();

    v1=v2++;
    v1.print();
}

输出(0,0)(2,2),而我期望(0,0)(1,1)。

你能帮我理解为什么会这样,以及恢复原始财产的可能性吗?

4

2 回答 2

4

它打印(0,0)(2,2)是因为您的 operator++与内置的不同,它在递增它之后V返回它所作用的对象的副本,而不是之前。

当您重载运算符时,这完全在您的控制之下,因此您有责任使其在这方面表现得像相应的内置运算符。

这就是你如何重写你的操作符来实现这个目标:

V operator++(int dummy)
{
    V v(vec[0],vec[1]); // Make a copy before incrementing: we'll return this!
    for(int i=0; i<2; i++)
    {
        ++vec[i];
    }
    return v; // Now this is *not* a copy of the incremented V object,
              // but rather a copy of the V object before incrementing!
}

这是一个活生生的例子

于 2013-06-20T22:14:06.847 回答
1

您需要在增加它们之前复制vec[0]和复制它们,而不是之后。vec[1]这种方式return v将返回原始值而不是增加的值。

V operator++(int dummy)
{
    V v(vec[0],vec[1]);
    for(int i=0; i<2; i++)
    {
        ++vec[i];
    }
    return v;
}
于 2013-06-20T22:14:01.020 回答