Давайте рассмотрим ваш пример - мы можем захотеть увеличить один и тот же объект в два раза, поэтому мы можем sh сделать следующее:
#include <iostream>
class MyObject
{
public:
MyObject()
{
cnt = 0;
}
MyObject& operator++()
{
++cnt;
return *this;
}
int cnt;
};
int main()
{
MyObject obj{};
std::cout << "The value at start " << obj.cnt << std::endl;
++obj;
std::cout << "The value after increment " << obj.cnt << std::endl;
++(++obj); // Legal ONLY when returning a reference!
std::cout << "The value after two increments in the same time: " << obj.cnt << std::endl;
}
В этом случае мы увеличиваем счетчик дважды используя цепочку, и, как мы и ожидали, мы получим следующий результат:
The value at start 0
The value after increment 1
The value after two increments in the same time: 3
Если мы должны вернуть объект, а не ссылку на this , тогда мы оперируем l -значение ссылки (поскольку у этого объекта нет имени!), следовательно, эта цепочка не сделает ничего с исходным объектом, как можно видеть в следующем примере:
#include <iostream>
class MyObject
{
public:
MyObject()
{
cnt = 0;
}
MyObject(const MyObject& other)
{
this->cnt = other.cnt;
}
MyObject operator++()
{
MyObject tmp(*this);
++cnt;
return tmp;
}
int cnt;
};
int main()
{
MyObject obj{};
std::cout << "The value at start " << obj.cnt << std::endl;
++obj;
std::cout << "The value after increment " << obj.cnt << std::endl;
++(++obj); // Legal ONLY when returning a reference!
std::cout << "The value after two increments in the same time: " << obj.cnt << std::endl;
}
вывод:
The value at start 0
The value after increment 1
The value after two increments in the same time: 2