Оператор присваивания по умолчанию и ссылки в C++
Здесь мы обсудили перегрузку оператора присваивания для динамически выделяемых ресурсов. В этой статье мы обсудили, что, когда мы не пишем собственный оператор присваивания, компилятор сам создает оператор присваивания, который выполняет поверхностное копирование и, таким образом, вызывает проблемы. Разница между поверхностным и глубоким копированием становится заметной, когда класс имеет указатели в качестве полей-членов. Однако нет никакой разницы, когда указатели не используются. Что происходит, когда у нас есть ссылки в нашем классе и нет определяемого пользователем оператора присваивания.
Например, предскажите вывод следующей программы:
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. Класс является производным от базового класса с недоступным оператором присваивания копирования.
Когда любое из вышеуказанных условий выполняется, пользователь должен определить оператор присваивания. Например, если мы добавим к приведенному выше коду оператор присваивания, код будет работать без ошибок.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.