Как работает возврат по ссылке в классах C ++?

В 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()?

0

Решение

Когда ваша функция-член возвращается 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
3

Другие решения

какие данные obj.add () возвращают в sub ()?

obj.add() возвращает ссылку на obj пример.

Текст «Возвращение к sub()«не имеет смысла вообще.

Однако в вашем случае ссылка на ваш объект очень похожа на простой указатель на ваш объект, и часто это хороший метафер.

0

По вопросам рекламы [email protected]