Куда девается ссылка на объект и как она выглядит (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 шт):
Пример попроще:
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 не вызывает оператора присваивания потому что мы просто записываем этот объект по этому адресу.