26. C++ Перегрузка префиксного и постфиксного инкремента

Перегрузка префиксного и постфиксного инкремента

Для начала поговорим чем отличаются префиксный и постфиксный инкремент и декремент (синтаксически они одинаковы):

Префиксный ++i;
Постфиксный i++;

Дело в том, что когда мы напишем код:

int i=10;
int a=++i;

у нас сначала выполнится действие ++i и лишь потом операция присваивания, и результат будет a=11;

а когда мы напишем код:

int i=10;
int a=i++;

у нас сначала выполнится действие a=i и лишь потом операция инкремента, т.е. a будет равно 10, а после I инкрементируется и станет равно 11.

Такая логика также накладывает отпечаток при перегрузке операторов инкремента/декремента у класса.

Так как синтаксически и префиксный и постфиксный операторы не отличаются (и там и там ++ ++ и — —) в C++ используется разные перегрузки для них, для постфиксного ставится какое-то значение в виде аргумента.

Person & operator ++ () //префиксный
{
   *(this->age) +=1;   //увеличиваем ЗНАЧЕНИЕ переменной
   return *this;
}

Person & operator ++ (int value)//постфиксный
{
    Person Temp(*this);
    *(this->age) +=1;          
    return Temp;
}

Как видно, в случае префиксного операций требуется меньше, в случае постфиксного требуется сначала создать буферный класс, скопировать (используем конструктор копирования) в него текущий, у текущего класса произвести инкремент и лишь потом вернуть ссылку на БУФЕРНЫЙ класс.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *