Copiar objetos: ejemplo
Se muestra la influencia de incluir una versión explícita del operador de asignación operator=() en la definición
de una clase. En primer lugar se muestra el comportamiento del operador de oficio proporcionado por el compilador. A continuación,
el comportamiento después de incluir una versión explícita.
Primer caso: operador de asignación proporcionado por el compilador
#include <iostream>
using namespace std;
int equ1[2] = {1, 2};
struct Liga {
int year;
char categoria;
char* nombre;
int equipos[2];
Liga(int y=2000, char ct='A', // constructor por defecto
char* nm="Anonimo", int eq[2]=equ1 );
void show(char); // función auxiliar
};
Liga::Liga(int y, char ct, char* nm, int eq[2]) {
year = y;
categoria = ct;
nombre = nm;
equipos[0] = eq[0]; equipos[1]=eq[1];
}
void Liga::show(char c) {
cout << c << "S1: " << year << endl;
cout << c << "S2: " << categoria << endl;
cout << c << "S3: " << nombre << endl;
cout << c << "S4: " << equipos[0] << endl;
cout << c << "S5: " << equipos[1] << endl;
cout << "\n";
}
int main() { // ===========
int eq[2] = {3,4};
Liga priDiv(2003, 'X', "Primera Division", eq);
Liga segDiv;
priDiv.show('a');
segDiv.show('b');
segDiv = priDiv; // M6:
segDiv.show('c');
return 0;
}
Salida:
aS1: 2003
aS2: X
aS3: Primera Division
aS4: 3
aS5: 4
bS1: 2000
bS2: A
bS3: Anonimo
bS4: 1
bS5: 3
cS1: 2003
cS2: X
cS3: Primera Division
cS4: 3
cS5: 4
Comentario
Las salidas a y b muestran como los objetos priDiv y segDiv son distintos: El primero se ha creado con unos argumentos explícitos para el constructor, mientras que el segundo se ha creado con los valores por defecto.
El grupo de salidas c, obtenido después de la sentencia M6, muestra como el operador de asignación oficial proporcionado por el compilador realiza una asignación miembro a miembro del Rvalue en el Lvalue.
Para comprobar el efecto de incluir una definición explícita de la función-operador operator=(), modificamos el diseño de la estructura Liga, que queda como sigue (el resto del ejemplo sigue exactamente igual):
struct Liga {
int year;
char categoria;
char* nombre;
int equipos[2];
Liga(int y=2000, char ct='A', // constructor por defecto
char* nm="Anonimo", int eq[2]=equ1 );
void show(char); // función auxiliar
Liga& operator= (const Liga& Li) { // operador de asignación
nombre = Li.nombre; // asignación explícita
return *this;
}
};
La nueva salida es:
aS1: 2003
aS2: X
aS3: Primera Division
aS4: 3
aS5: 4
bS1: 2000
bS2: A
bS3: Anonimo
bS4: 1
bS5: 2
cS1: 2000
cS2: A
cS3: Primera Division
cS4: 1
cS5: 2
Comentario
Puede verse que la existencia de la versión explícita para el operador de asignación ha motivado que después de la asignación
de M6 , el objeto segDiv se
mantenga exactamente igual que antes. El único miembro que ha cambiado es SegDiv.nombre, que es el único que ha recibido
una asignación explícita en la nueva función operator=().