Hemos discutido la sobrecarga del operador de asignación para recursos asignados dinámicamente aquí . En este artículo, discutimos que cuando no escribimos nuestro propio operador de asignación, el compilador crea un operador de asignación que hace una copia superficial y, por lo tanto, causa problemas. La diferencia entre copia superficial y copia profunda se vuelve visible cuando la clase tiene punteros como campos de miembros. Sin embargo, no hay diferencia cuando no se utilizan punteros. Qué sucede cuando tenemos referencias en nuestra clase y no hay un operador de asignación definido por el usuario.
Por ejemplo, prediga la salida del siguiente programa,
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; }
Producción:
Compiler Error: non-static reference member 'int& Test::ref', can't use default assignment operator
El compilador no crea un operador de asignación predeterminado en los siguientes casos:
1. La clase tiene un miembro de datos no estático de un tipo const o un tipo de referencia.
2. La clase tiene un miembro de datos no estático de un tipo que tiene un operador de asignación de copia inaccesible.
3. La clase se deriva de una clase base con un operador de asignación de copia inaccesible.
Cuando alguna de las condiciones anteriores es verdadera, el usuario debe definir el operador de asignación. Por ejemplo, si agregamos un operador de asignación al código anterior, el código funciona bien sin ningún error.
CPP
// CPP Program to demonstrate 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; } Test& operator=(const Test& t) { x = t.x; return *this; } }; int main() { Test t1(10); Test t2(20); t2 = t1; t1.setX(40); t2.print(); return 0; }
10
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA