Перегрузка операторов увеличения и уменьшения (C++)

Операторы инкремента и декремента относятся к особой категории, поскольку имеется два варианта каждого из них:

  • преинкрементный и постинкрементный операторы;

  • предекрементный и постдекрементный операторы.

При написании функций перегруженных операторов полезно реализовать отдельные версии для префиксной и постфиксной форм этих операторов. Чтобы различать эти два, следует соблюдать следующее правило: форма префикса оператора объявляется точно так же, как и любой другой унарный оператор; Форма postfix принимает дополнительный аргумент типа int.

Примечание.

При указании перегруженного оператора для формы постфикса оператора добавочного или декремента дополнительный аргумент должен быть типом int; при указании любого другого типа возникает ошибка.

В следующем примере показано определение операторов префиксных и постфиксных инкремента и декремента для класса Point.

// increment_and_decrement1.cpp
class Point
{
public:
   // Declare prefix and postfix increment operators.
   Point& operator++();       // Prefix increment operator.
   Point operator++(int);     // Postfix increment operator.

   // Declare prefix and postfix decrement operators.
   Point& operator--();       // Prefix decrement operator.
   Point operator--(int);     // Postfix decrement operator.

   // Define default constructor.
   Point() { _x = _y = 0; }

   // Define accessor functions.
   int x() { return _x; }
   int y() { return _y; }
private:
   int _x, _y;
};

// Define prefix increment operator.
Point& Point::operator++()
{
   _x++;
   _y++;
   return *this;
}

// Define postfix increment operator.
Point Point::operator++(int)
{
   Point temp = *this;
   ++*this;
   return temp;
}

// Define prefix decrement operator.
Point& Point::operator--()
{
   _x--;
   _y--;
   return *this;
}

// Define postfix decrement operator.
Point Point::operator--(int)
{
   Point temp = *this;
   --*this;
   return temp;
}

int main()
{
}

Те же операторы можно определить в файлах область (глобально) с помощью следующих прототипов функций:

friend Point& operator++( Point& );      // Prefix increment
friend Point operator++( Point&, int );  // Postfix increment
friend Point& operator--( Point& );      // Prefix decrement
friend Point operator--( Point&, int );  // Postfix decrement

Аргумент типа int , обозначающий форму постфикса оператора добавочного или декремента, обычно не используется для передачи аргументов. Он обычно содержит значение 0. Однако его можно использовать следующим образом:

// increment_and_decrement2.cpp
class Int
{
public:
    Int operator++( int n ); // Postfix increment operator
private:
    int _i;
};

Int Int::operator++( int n )
{
    Int result = *this;
    if( n != 0 )    // Handle case where an argument is passed.
        _i += n;
    else
        _i++;       // Handle case where no argument is passed.
    return result;
}

int main()
{
   Int i;
   i.operator++( 25 ); // Increment by 25.
}

Для передачи этих значений, отличных от явного вызова, нет синтаксиса для использования операторов добавочного или декремента, как показано в предыдущем коде. Более простой способ реализации этой функции — перегрузка оператора добавления или назначения (+=).

См. также

Перегрузка операторов