В чём разница между *this и this?
Я никак не могу понять в чём между ними разница. this - указатель на объект, *this - ссылка на объект. Если *this - разыменование указателя, то *this возвращает объект.
Объект - это получается ссылка?
Ответы (3 шт):
*this - по своей сущности не ссылка! Это сам объект. Именно возвращаемое значение определяет каким будет this. Смотрите:
MyClass foo();
MyClass& foo();
Это по-разному можно интерпретировать. Как видите, разыменованый this в первом варианте - просто копия объекта, в втором - ссылка на объект класса.
Ссылка хранится в памяти как константный указатель на объект (Константный подразумевается сам указатель, а не объект.), но обращение по ссылке автоматически переводятся к этому объекту. И синтаксис такой-же как к обычному объекту.
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;
}