Ejercicios de Clases

2. Constructor Copia (informativo)

Constructor copia

Un constructor de este tipo crea un objeto a partir de otro objeto existente. Estos constructores sólo tienen un argumento, que es una referencia a un objeto de su misma clase.

El constructor de copia, como su nombre indica, se usa para copiar los datos de un objeto a otro objeto (del mismo tipo) que se esté construyendo . Conceptualmente el objeto en construcción no tiene ningún motivo para modificar el objeto que está copiando, por eso el parámetro recibido suele ser constante, aunque el estándar no prohíbe que no sea constante

Pues bien, el constructor copia sirve para inicializar un objeto a imagen y semejanza de otro ya existente. Se usan para evitar crear copias recursivas del objeto.

Ejemplo :

struct Test
{  int var;
  Test(Test t) //Constructor copia.
  { var = t.var; }    
};

En el momento en el que se tuviese que llamar al constructor copia se tendría que hacer antes una copia temporal del objeto original para almacenarla en t. Al crear esa copia se entraría en el constructor copia otra vez y esto originaría otra copia, que provocaría otra llamada al constructor... y así hasta que la pila se desborda.
Al usar referencias se evitan las copias y con ello esta problemática de la llamada recursiva.
Adicionalmente, la referencia se marca como constante para evitar que, por error, el objeto original pueda verse modificado.

También en este caso, si no se especifica ningún constructor copia, el compilador crea uno por defecto, y su comportamiento es exactamente el mismo que el del definido en el ejemplo anterior. Para la mayoría de los casos esto será suficiente, pero en muchas ocasiones necesitaremos redefinir el constructor copia.

#include <iostream>
using namespace std;
class Test
{
int var;
public:
//Constructor copia.
Test(){var=0;}
//Constructor copia.
Test(Test &t) { var = t.var; };
//Métodos
int mostrar(void){return var;};
void cargar(int z){var=z;};
};

int main(int argc, char *argv[]) {
    Test X;
    cout<<X.mostrar()<<endl;
    X.cargar(3);
    cout<<X.mostrar()<<endl;
    //Y=X; si sería una asiganción!
    Test Y(X);//Manera 1 de invocar al const. copia.
    //Test Y=X; //Manera 2 de invocar el const. copia.
    cout<<Y.mostrar()<<endl;
    Y.cargar(4);//Cambio el valor de var en Y, pero no en X.
    cout<<Y.mostrar()<<endl;
    cout<<X.mostrar()<<endl;
    return 0;
}