Перегрузка префиксного и постфиксного инкремента
Для начала поговорим чем отличаются префиксный и постфиксный инкремент и декремент (синтаксически они одинаковы):
Префиксный ++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;
}
Как видно, в случае префиксного операций требуется меньше, в случае постфиксного требуется сначала создать буферный класс, скопировать (используем конструктор копирования) в него текущий, у текущего класса произвести инкремент и лишь потом вернуть ссылку на БУФЕРНЫЙ класс.