'this' в С++ является указателем на ссылку?

Я знаю, что это глупо, и заголовок, вероятно, не является ответом. Я всегда думал о this как об указателе на текущий объект, который предоставляется при каждом вызове метода из объекта (который не является статическим методом)

но глядя на то, что на самом деле возвращает мой код, например:

Test& Test::func () 
{ 
   // Some processing 
   return *this; 
} 

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


person crommy    schedule 10.12.2019    source источник
comment
Слишком много: en.cppreference.com/w/cpp/language/this   -  person Richard Critten    schedule 11.12.2019
comment
related/dupe: stackoverflow.com/questions/48388510/   -  person NathanOliver    schedule 11.12.2019
comment
this в C++ — это указатель на сам экземпляр объекта. Разыменование дает объект. Возврат объекта по ссылке формирует ссылку (псевдоним) на объект, и это то, что возвращается.   -  person Jesper Juhl    schedule 11.12.2019
comment
Боковое примечание: вы не можете сделать указатель на ссылку. Ссылка — это просто другое имя для существующего объекта, поэтому не на что указывать. Возьмите адрес ссылки, и вы получите адрес объекта, на который ссылаются.   -  person user4581301    schedule 11.12.2019
comment
Ссылки были добавлены в C++ позже. В противном случае у нас, вероятно, была бы ссылка self, то есть Test&. Но к тому времени, когда были добавлены ссылки, эти отправления уже отплыли, и this прочно укоренился, и на него полагались десятки, если не сотни, пользователей.   -  person Eljay    schedule 11.12.2019


Ответы (3)


Помните, что ссылка — это просто другое имя объекта.

Это означает, что возврат ссылки — это то же самое, что и возврат объекта на уровне абстракции типа; в результате это не одно и то же: возврат ссылки означает, что вызывающий объект получает ссылку на текущий объект, тогда как возврат объекта дает ему (ссылку на) копировать текущего объекта — со всеми вытекающими последствиями, такими как вызов конструктора копирования, принятие решений о глубоком копировании и т. д.

person Aganju    schedule 10.12.2019

Из cppreference:

Ключевое слово this представляет собой выражение prvalue, значением которого является адрес объекта, для которого вызывается функция-член.

И затем (возможно, легче понять):

Тип this в функции-члене класса X — X* (указатель на X). Если функция-член имеет квалификацию cv, типом this является cv X* (указатель на X с идентичной квалификацией cv). Поскольку конструкторы и деструкторы не могут быть квалифицированы cv, тип this в них всегда X*, даже при создании или уничтожении объекта const.

Итак, this — это не указатель на ссылку, а просто указатель.

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

Кроме того, в C++ нет специального синтаксиса для формирования ссылки. Вместо этого ссылки должны быть связаны при инициализации, например:

int x = 3;
int& y = x;   // x is int, but y is int&
assert( &y == &x); // address of y is the address of x

Аналогично при возврате ссылки из функции:

int& get_x() {
    static int x = 3;
    return x;
}
person 463035818_is_not_a_number    schedule 10.12.2019

Проще говоря:

test t1;  //  t1 is a test object.

test& t2 = t1; //  t2 is another name for t1.

test* t3; //  t3 holds an address of a test object.

*t3; //  derefernce t. which gives you, the test object that t3 points to.

this — это указатель на текущий тестовый объект.
поэтому *this — это текущий тестовый объект, а поскольку тип возвращаемого значения — test&, при вызове функции вы получаете тот же объект, из которого вызывали функцию.

person avish    schedule 10.12.2019