Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


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=().