Ejemplo
Demostración de la invocación automática del constructor; constructor-copia, y destructor de objetos por el compilador, incluyendo la creación de objetos temporales.
#include <iostream>
using namespace std;
class Vector {
public: float x, y;
Vector (int i = 0, int j = 0) { // constructor por defecto
cout << "Constructor." << endl;
x = i; y = j;
}
Vector(const Vector& v) { // constructor-copia
cout << "Constructor-copia" << endl;
x = v.x; y = v.y;
}
~Vector() { // destructor
cout << "Destructor." << endl;
}
};
Vector func (Vector v) { // función auxiliar
v.x = v.x+1; v.y = v.y+1;
return v;
}
void main() { // =====================
Vector v1(1,2); // M1:
Vector v2 = v1; // M2:
Vector v3 = func(v1); // M3:
v2 = v3;
// M4:
}
// M5:
Salida:
Constructor.
Constructor-copia
Constructor-copia
Constructor-copia
Destructor.
Destructor.
Destructor.
Destructor.
Comentario
Las salidas tienen la siguiente justificación:
M.1: Invocación al constructor por defecto (sin argumentos) -> Salida 1.
M.2: Invocación al constructor-copia (crea obj2 con el mismo contenido que obj1) -> Salida 2.
M.3: a.- Invocación de la función: Invocación del constructor-copia para crear un objeto v local a la función, igual que el objeto obj1 pasado como argumento -> Salida 3.
b.- Invocación del constructor-copia para crear un objeto obj3, con el mismo contenido que el valor devuelto por la función -> Salida 4. Simultáneamente termina la función y se invoca al destructor para terminar el objeto v -> Salida 5.
M.4: No se invoca ningún constructor. La asignación es totalmente distinta de la construcción y de la construcción-copia (se realiza entre objetos ya creados).
M.5: Invocación de los destructores de los objetos obj1, obj2 y obj3, Salidas 6, 7 y 8.
Ejemplo relacionado:
4.11.2d2w1