В C++
если я наберу:
int x=5;
int &y=x;
затем y
будет действовать как псевдоним для места памяти, где оригинал x
хранится, и это может быть доказано / проверено путем распечатки памяти в обоих местах, x
а также y
вывод аналогичной программы ниже:
x is at location: 0x23fe14
y is at location: 0x23fe14
Но что насчет классы?
когда функция-член объявлена с тип возврата в качестве ссылки и функция использует this
указатель, что функция на самом деле возвращает?
например:
#include <iostream>
class simple
{
int data;
public:
// ctor
simple():
data(0)
{}
// getter function
int& getter_data()
{ return this->data; }
// modifier functions
simple& add(int x=5)
{ this->data += x;
return *this;
}
simple& sub(int x=5)
{ this->data -= x;
return *this;
}
};
int main()
{ simple obj;
obj.add().sub(4); ////////// how & why is it working? /////////
std::cout<<obj.getter_data();
getchar();
}
почему можно выполнить команду в выделенной строке?
что это за данные obj.add()
возвращаясь к sub()
?
Когда ваша функция-член возвращается simple&
инициализируется с *this
(*this
быть примером simple
) семантика такая же, как у вашего собственного «справочного примера»; ссылка инициализируется с пример этого типа.
Вы инициализируете возвращенную ссылку самим объектом.
Приведенные ниже фрагменты семантически эквивалентны:
obj.add ().sub (4);
simple& ref = obj.add ();
ref.sub (4); // `ref` is really `obj`,
// the address of `ref` and `obj` are the same
какие данные obj.add () возвращают в sub ()?
obj.add()
возвращает ссылку на obj
пример.
Текст «Возвращение к sub()
«не имеет смысла вообще.
Однако в вашем случае ссылка на ваш объект очень похожа на простой указатель на ваш объект, и часто это хороший метафер.