Куда девается ссылка на объект и как она выглядит (return *this)

Главные вопросы =====================

1)Как будет выглядеть *this

2)Как будет выглядеть ссылка которая у меня возвращается в перегрузке оператора "="

3)Куда она попадает после возвращения(именно шаг за шагом)?

4)Если это ссылка то как она дальше может работать в качестве параметра если у меня там уже стоит &

============================================

Мои догадки --------------------------------------------

^ // обозначу как временная переменная без имени но с адресом в памяти

1) Разыменованный this будет моим объектом a

2) Потом происходит что-то вроде этого : тип &^_ссылка = a

3) Дальше уже представить не могу что кому присваивается

-----------------------------------------------------------

Про код ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Здесь простенький класс в котором динамический массив и конструкторы. Основная непонятка с конструктором присваивания а именно с *this для c=a=b

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#include <iostream>
using namespace std;

class MyClass {
    int * data;
public:
    int Size;
    MyClass(int size) {//Конструктор по умолчанию
        this->Size = size;
        this->data = new int[size];
        for (int i = 0; i < size; i++) {
            data[i] = i;
            cout << data[i];
        }
        cout << endl;
        cout << "Вызвался Конструктор : "<< this << endl;
    }
    MyClass(const MyClass &other) { //конструктор копирования
        this->Size = other.Size;

        this->data = new int[other.Size];

        for (int i = 0; i < other.Size; i++) {
            this->data[i] = other.data[i];
        }
        cout << "Вызвался конструктор копирования" << this << endl;
    }
    MyClass & operator = (const MyClass& other) {//Перегрузка
        cout << "Вызвался оператор = " << this << endl;
        cout << "Вызвался параметер который копируется = " << &other << endl;
        this->Size = other.Size;
        if (this->data != nullptr) {
            delete[] this->data;
        }
        this->data = new int[other.Size];
        for (int i = 0; i < other.Size; i++) {
            this->data[i] = other.data[i];
        }
        return *this;

    }

    ~MyClass() { // Деструктор
        cout  << "Вызвался Деструктор : " << this  << endl;
        delete[] data;
    }
};


int main()
{
    setlocale(LC_ALL, "ru");
    MyClass a(10);
    MyClass b(2);
    MyClass c(5);
    c = a = b;
}

Ответы (1 шт):

Автор решения: 0x00004

Пример попроще:

class SomeClass
{
public:
    SomeClass()
    {
        a = 5;
    }
    SomeClass(int l_a)
    {
        a = l_a;
    }

    SomeClass& operator=(const SomeClass &l_copy)
    {
        this->a = l_copy.a;
        return *this;
    }

    int a;
};

SomeClass a;

SomeClass b;

a=b равносильно следующему: a.operator=(b);

Все что происходит в данном операторе это this->a=l_copy.a и все.

Return *this игнорируется.

Не игнорируется в том случае например когда SomeClass &ref=(a=b) и еще в каком то\каких то других случаях;

1)return *this - return новая копия этого объекта ,т.е. обновленная а;

2) SomeClass &refA= *this, т.е. а;

3)эта же ссылка присваивается ссылке SomeClass &refB=refA;

SomeClass &ref = a не вызывает оператора присваивания потому что мы просто записываем этот объект по этому адресу.

→ Ссылка