Что делает *this?
Просто this, как я понял, возвращает ссылку на вызывающий объект. А что *this делает? Я читал что разыменование указателя дает значение на который этот указатель указывает.
int a = 1
int *pa = &a
*pa == 1 true
Но *this вообще запутал
Ответы (3 шт):
Верно, что * - оператор разыменования, неверно, что this - ссылка.
this - указатель на текущий объект. Таким образом,
*this - ссылка на текущий объект.
На встроенных типах данных не очень понятно объяснять. Лучше на классах.
Когда у вас есть класс, в нем есть данные и методы. Из метода класса есть доступ к данным этого класса.
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 - это указатель на текущий объект.
Не путайтесь в выражениях. 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 в этом случае, то вы бы не смогли даже скомпилировать этот код (В моём компиляторе).
Кстати: если вам плохо даётся понимание всех этих ссылок/указателей - почитайте про то, как устроена оперативная память в ПК. Мне это помогло разобраться во всём этом.