this
- указатель, а *this
- разыменованный указатель.
Если бы у вас была функция, которая возвратила this
, это был бы указатель на текущий объект, тогда как функция, которая возвратила *this
, была бы "клоном" текущего объекта, размещенного в стеке - если вы не указали тип возврата метода для возврата ссылки.
Простая программа, которая показывает разницу между работой с копиями и ссылками:
#include <iostream>
class Foo
{
public:
Foo()
{
this->value = 0;
}
Foo get_copy()
{
return *this;
}
Foo& get_copy_as_reference()
{
return *this;
}
Foo* get_pointer()
{
return this;
}
void increment()
{
this->value++;
}
void print_value()
{
std::cout << this->value << std::endl;
}
private:
int value;
};
int main()
{
Foo foo;
foo.increment();
foo.print_value();
foo.get_copy().increment();
foo.print_value();
foo.get_copy_as_reference().increment();
foo.print_value();
foo.get_pointer()->increment();
foo.print_value();
return 0;
}
Выход:
1
1
2
3
Вы можете видеть, что когда мы работаем с копией нашего локального объекта, изменения не сохраняются (потому что это совершенно другой объект), а работают со ссылкой или указателем сохранить изменения.