C++ Constructor y destructor de clase

Clases y objetos en C++

Constructor de clase

de la claseConstructorEs una función miembro especial de la clase que se ejecuta automáticamente cada vez que se crea un nuevo objeto de ella.

El nombre del constructor es exactamente igual al nombre de la clase y no tiene tipo de retorno (ni siquieravoidpuede tener void).

Si no se define explícitamente un constructor, el compilador generará automáticamente un constructor predeterminado que no realiza ninguna operación.

El siguiente ejemplo ayuda a comprender mejor el concepto de constructor:

Ejemplo

#include <iostream> using namespace std; class Line { public: Line(); // Declaración del constructor void setLength(double len); double getLength() const; private: double length; }; // Definición del constructor Line::Line() { cout << "Object is being created" << endl; length = 0.0; // Inicializar explícitamente las variables miembro } void Line::setLength(double len) { length = len; } double Line::getLength() const { return length; } // Función principal del programa int main() { Line line; // Establecer la longitud line.setLength(6.0); cout << "Length of line : " << line.getLength() << endl; return 0; }

Cuando el código anterior se compila y ejecuta, produce los siguientes resultados:

Object is being created
Length of line : 6

Constructor con parámetros

El constructor predeterminado no tiene parámetros, pero si es necesario, el constructor también puede tener parámetros. De esta manera, al crear un objeto se le asignan valores iniciales sin necesidad de llamar por separado asetla función, como se muestra en el siguiente ejemplo:

Ejemplo

#include <iostream> using namespace std; class Line { public: Line(double len); // Declaración del constructor con parámetros void setLength(double len); double getLength() const; private: double length; }; // Definición del constructor Line::Line(double len) { cout << "Object is being created, length = " << len << endl; length = len; } void Line::setLength(double len) { length = len; } double Line::getLength() const { return length; } // Función principal del programa int main() { Line line(10.0); // Pasar la longitud inicial directamente al crear el objeto // Obtener la longitud inicial cout << "Length of line : " << line.getLength() << endl; // Restablecer la longitud line.setLength(6.0); cout << "Length of line : " << line.getLength() << endl; return 0; }

Cuando el código anterior se compila y ejecuta, produce los siguientes resultados:

Object is being created, length = 10
Length of line : 10
Length of line : 6

Usar listas de inicialización para inicializar campos

C++ recomienda usarla lista de inicialización de miembrospara inicializar variables miembro. Su sintaxis es agregar dos puntos después de la lista de parámetros del constructor (:), y luego escribirNombre de variable miembro (valor inicial)。

En el siguiente ejemplo,: length(len)el significado es: usar el parámetro pasadolenpara inicializar directamente la variable miembrolength.coutLo que se imprime es la variable miembrolength, no el parámetrolen, de modo que se puede verificar de forma intuitiva que la variable miembro ha sido asignada correctamente:

Line::Line(double len) : length(len) { // En este momento, length ya se ha asignado mediante la lista de inicialización; se imprime length para verificar el resultado cout << "Object is being created, length = " << length << endl; }

La sintaxis anterior es equivalente al siguiente método de asignación dentro del cuerpo de la función; ambos producen exactamente el mismo resultado:

Line::Line(double len) { length = len; // Asignar el parámetro len a la variable miembro length cout << "Object is being created, length = " << length << endl; }

La diferencia entre ambos métodos es que la lista de inicializaciónantes de entrar en el cuerpo de la funciónya completa la inicialización de las variables miembro, mientras que la asignación dentro del cuerpo de la función primero construye por defecto y luego asigna, añadiendo un paso. Paraconstmiembros const, miembros de referencia y miembros de objetos que no tienen constructor predeterminado, la lista de inicialización esla únicaforma de inicialización.

Supongamos que hay una clase C con varios campos X, Y, Z, etc. que necesitan inicialización; solo hay que separarlos con comas, como se muestra a continuación:

C::C(double a, double b, double c) : X(a), Y(b), Z(c) { // Otra lógica de inicialización (si la hay) }

Nota:El orden de inicialización de cada miembro en la lista de inicializaciónestá determinado por su orden de declaración en la clase, no por el orden de escritura; se recomienda mantener la coherencia para evitar confusiones.

Destructor de clase

de la claseDestructores un tipo especial de función miembro de la clase, que al final del ciclo de vida del objeto (al salir del ámbito o serdeleteeliminado) se ejecuta automáticamente, y se utiliza para liberar los recursos ocupados por el objeto (como memoria dinámica, manejadores de archivos, etc.).

El nombre del destructor es exactamente igual al nombre de la clase, solo que se añade una virgulilla (~) como prefijo. No devuelve ningún valor, no puede tener parámetros, y cada clase solo puede tener un destructor.

El siguiente ejemplo ayuda a comprender mejor el concepto de destructor:

Ejemplo

#include <iostream> using namespace std; class Line { public: Line(); // Declaración del constructor ~Line(); // Declaración del destructor void setLength(double len); double getLength() const; private: double length; }; // Definición del constructor Line::Line() { cout << "Object is being created" << endl; length = 0.0; } // Definición del destructor Line::~Line() { cout << "Object is being deleted" << endl; // Si hay recursos asignados dinámicamente, se liberan aquí, por ejemplo: delete[] data; } void Line::setLength(double len) { length = len; } double Line::getLength() const { return length; } // Función principal del programa int main() { Line line; // Al finalizar el programa, el destructor se llama automáticamente // Establecer la longitud line.setLength(6.0); cout << "Length of line : " << line.getLength() << endl; return 0; }

Cuando el código anterior se compila y ejecuta, produce los siguientes resultados:

Object is being created
Length of line : 6
Object is being deleted

Clases y objetos en C++

Otras extensiones