Оператор присваивания по умолчанию и ссылки в C++

Опубликовано: 15 Сентября, 2022

Здесь мы обсудили перегрузку оператора присваивания для динамически выделяемых ресурсов. В этой статье мы обсудили, что, когда мы не пишем собственный оператор присваивания, компилятор сам создает оператор присваивания, который выполняет поверхностное копирование и, таким образом, вызывает проблемы. Разница между поверхностным и глубоким копированием становится заметной, когда класс имеет указатели в качестве полей-членов. Однако нет никакой разницы, когда указатели не используются. Что происходит, когда у нас есть ссылки в нашем классе и нет определяемого пользователем оператора присваивания.

Например, предскажите вывод следующей программы:

CPP




// CPP program to demonstrate  references in a class and
// there is no user defined assignment operator
#include <iostream>
using namespace std;
  
class Test {
    int x;
    int& ref;
  
public:
    Test(int i)
        : x(i)
        , ref(x)
    {
    }
    void print() { cout << ref; }
    void setX(int i) { x = i; }
};
  
// Driver Code
int main()
{
    Test t1(10);
    Test t2(20);
    t2 = t1;
    t1.setX(40);
    t2.print();
    return 0;
}

Выход:

Compiler Error: non-static reference member "int& Test::ref", 
             can"t use default assignment operator

Компилятор не создает оператор присваивания по умолчанию в следующих случаях:

1. Класс имеет нестатический элемент данных константного или ссылочного типа.
2. Класс имеет нестатический член данных типа, который имеет недоступный оператор присваивания копирования.
3. Класс является производным от базового класса с недоступным оператором присваивания копирования.

Когда любое из вышеуказанных условий выполняется, пользователь должен определить оператор присваивания. Например, если мы добавим к приведенному выше коду оператор присваивания, код будет работать без ошибок.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.

C++ C