Я изучаю перегрузку операторов в 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).
Можете ли вы помочь мне понять, почему это так, и есть ли возможность восстановить первоначальную собственность?
Это печатает (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!
}
Вот живой пример.
Вам нужно сделать копию 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;
}