3

Я изучаю перегрузку оператора на C++. Исходный суффикс ++ обладает тем свойством, что он имеет более низкий приоритет, чем оператор присваивания. Так, например, int i=0, j=0; i=j++; cout<<i<<j выведет 01. Но это свойство кажется потерянным, когда я перегружаю постфикс ++.Прерывание/суффикс перегрузки оператора C++

#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

спасибо за очищение моего недоразумения, я протестировал проблему, используя int i = 0, j = 0; я = (J ++); соиЬ << I << J; и он выводит 01. Таким образом, речь идет не о приоритете, а о механизме возврата. – focusHard

ответ

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; 
} 
4

Он печатает (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! 
} 

Вот является live example.

 Смежные вопросы

  • Нет связанных вопросов^_^