Перегрузка операторов увеличения и уменьшения (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.
}
Для передачи этих значений, отличных от явного вызова, нет синтаксиса для использования операторов добавочного или декремента, как показано в предыдущем коде. Более простой способ реализации этой функции — перегрузка оператора добавления или назначения (+=).
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по