Что делает *this?

Просто this, как я понял, возвращает ссылку на вызывающий объект. А что *this делает? Я читал что разыменование указателя дает значение на который этот указатель указывает.

int a = 1
int *pa = &a
*pa == 1 true

Но *this вообще запутал


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

Автор решения: Mikhailo

Верно, что * - оператор разыменования, неверно, что this - ссылка.

this - указатель на текущий объект. Таким образом,
*this - ссылка на текущий объект.

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

На встроенных типах данных не очень понятно объяснять. Лучше на классах.
Когда у вас есть класс, в нем есть данные и методы. Из метода класса есть доступ к данным этого класса.

class MyClass
{
   public:
   int data;
   void method(void) { data++; }
}

int main()
{
  MyClass obj1, obj2;
  obj1.method();
}

Вы создали объект этого класса и вызываете метод. Как система узнаёт, что метод вызван для объекта obj1, а не для какого-то другого? Как в методе определить над какими данными нужно производит операции? Программист этого не видит, но в метод неявно передается указатель this для того объекта, для которого вызван метод. И доступ к данным идет относительно него.

void method(class MyClass* this) // на самом деле сигнатура метода выглядит вот так
// она компилятором генерируется автоматически!!! Самому так писать не надо!
{
  this->data++; // доступ к данным идет через указатель this
}

Когда вызывается метод для объекта, адрес этого объекта передается в метод, чтобы он мог оперировать данными именно этого объекта.
Если коротко, this - это указатель на текущий объект.

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

Не путайтесь в выражениях. this - это указатель, не ссылка. Когда вы используете *this вы как бы избавляетесь от посредника (указателя). И используете уже сам объект на который этот указатель указывает. Например: представим ситуацию, когда нам нужно вернуть ссылку на наш объект в методе. Тогда мы и будем использовать *this:

#include <iostream>

using namespace std;

class thisClass
{
public:
    thisClass& getThis() // thisClass& - это ссылка. А вот thisClass* - указатель.
    {
        return *this;
    }
};

int main() 
{
    thisClass myClass;
    thisClass& link = myClass.getThis();
    system("pause");
    return 1;
};

Если бы вы использовали this в этом случае, то вы бы не смогли даже скомпилировать этот код (В моём компиляторе).

Кстати: если вам плохо даётся понимание всех этих ссылок/указателей - почитайте про то, как устроена оперативная память в ПК. Мне это помогло разобраться во всём этом.

→ Ссылка