Перегрузка операторов инкремента и декремента

Операторы инкремента (++) и декремента (--) также являются унарными операторами, но они изменяют сам объект. Кроме того, операторы могут использоваться в постфиксной или префиксной формах. При постфиксной форме (x++) возвращается значение переменной перед операцией, а при префиксной форме (++x) — вначале производится операция и только потом возвращается значение.

Прототипы «операторных» методов:

<Название класса> &operator++();      // ++obj
<Название класса> &operator--();      // --obj
<Название класса> operator++(int);    // obj++
<Название класса> operator--(int);    // obj--

Прототипы дружественных функций:

friend <Название класса> &operator++(<Название класса> &);     // ++obj
friend <Название класса> &operator--(<Название класса> &);     // --obj
friend <Название класса> operator++(<Название класса> &, int); // obj++
friend <Название класса> operator--(<Название класса> &, int); // obj--

Целочисленный параметр, используемый в прототипах при постфиксной форме, можно проигнорировать. По умолчанию этот параметр имеет значение 0. Пример перегрузки оператора инкремента приведен в листинге 14.3.

Листинг 14.3. Перегрузка оператора инкремента

#include <iostream>

class C {
   int x_;
public:
   C() { x_ = 0; }                   // Конструктор по умолчанию
   explicit C(int x) { x_ = x; }     // Обычный конструктор
   C(const C &c) { x_ = c.x_; }      // Конструктор копирования
   int getX() const { return x_; }

   C &operator++();                  // ++obj
   C operator++(int);                // obj++
};

int main() {
   C obj1(10), obj2;
   obj2 = ++obj1;
   std::cout << obj1.getX() << std::endl; // 11
   std::cout << obj2.getX() << std::endl; // 11
   obj2 = obj1++;
   std::cout << obj1.getX() << std::endl; // 12
   std::cout << obj2.getX() << std::endl; // 11
   ++obj2;
   std::cout << obj1.getX() << std::endl; // 12
   std::cout << obj2.getX() << std::endl; // 12
   return 0;
}

C &C::operator++() {                      // ++obj
   ++x_;
   return *this;
}
C C::operator++(int x) {                  // obj++
   // std::cout << x << std::endl;        // 0
   C tmp(x_);
   ++(*this);
   return tmp;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов