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.
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;
}