В чём разница между *this и this?

Я никак не могу понять в чём между ними разница. this - указатель на объект, *this - ссылка на объект. Если *this - разыменование указателя, то *this возвращает объект.

Объект - это получается ссылка?


Ответы (3 шт):

Автор решения: ТарасПрогер

*this - по своей сущности не ссылка! Это сам объект. Именно возвращаемое значение определяет каким будет this. Смотрите:

MyClass foo();
MyClass& foo();

Это по-разному можно интерпретировать. Как видите, разыменованый this в первом варианте - просто копия объекта, в втором - ссылка на объект класса.

→ Ссылка
Автор решения: AlexGlebe

Ссылка хранится в памяти как константный указатель на объект (Константный подразумевается сам указатель, а не объект.), но обращение по ссылке автоматически переводятся к этому объекту. И синтаксис такой-же как к обычному объекту.

class C{
public :
  int x ;
};

C o ;  // объект
C * const po = & o ; // константный указатель на объект
C & ps = o ; // ссылка на объект

po -> x = 0 ; // обращение по указателю
ps . x = 0 ; // обращение по ссылке
o . x = 0 ; // к объекту так-же как по ссылке

Оператор звёздочка * на указатель преобразует его на ссылку.

po -> x === ( * po ) . x === ps . x === o . x

C &       spo = * po ; // из указателя на ссылку
С * const pps = & ps ; // из ссылки на указатель

Для вашего вопроса this - это константный указатель на изменяемый объект, а * this - это ссылка.

→ Ссылка
Автор решения: Тарас Атавин

Да, *this – это ссылка на себя, а просто this – указатель. У них разные синтаксисы и разные возможности. Например, получив объект по ссылке, вызывающий код не может даже попытаться, не приводя ссылку к указателю, освободить память, занятую объектом, на который указывает this. Если же вернуть this, то сама попытка возможна. Защитит ли система объект от удаления – вопрос отдельный.

class A
{
 public:
  int x;
 A& f1 =(const int &x)
 {
  this->x=x;
  return *this;  
 }
 A* f2 =(const int &x)
 {
  this->x=x;
  return this;  
 }
};
int main()
{
 A *p1;
 A *p2;
 p1=new A;
 p2=new A;
 delete p1->f1(2); // Синтаксическая ошибка, объект по указателю p1 защищён, несмотря на размещение в куче
 delete p2->f2(2); // Объект по указателю p2 будет удалён, а занимаемая им память – освобождена
return 0;
}
→ Ссылка