Префикс / суффикс перегрузки оператора C ++

Я изучаю перегрузку операторов в 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).

Можете ли вы помочь мне понять, почему это так, и есть ли возможность восстановить первоначальную собственность?

3

Решение

Это печатает (0,0)(2,2) потому что ваш оператор ++в отличие от встроенного, возвращает копию 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!
}

Вот живой пример.

4

Другие решения

Вам нужно сделать копию 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;
}
1

По вопросам рекламы [email protected]