Constructor y destructor de clases C ++

El constructor de clases

Una clase constructor es una función miembro especial de una clase que se ejecuta cada vez que creamos nuevos objetos de esa clase.

Un constructor tendrá exactamente el mismo nombre que la clase y no tiene ningún tipo de retorno, ni siquiera vacío. Los constructores pueden ser muy útiles para establecer valores iniciales para ciertas variables miembro.

El siguiente ejemplo explica el concepto de constructor:

#include <iostream>
 
using namespace std;
 
class Line {
   public:
      void setLength( double len );
      double getLength( void );
      Line();  // This is the constructor
   private:
      double length;
};
 
// Member functions definitions including constructor
Line::Line(void) {
   cout << "Object is being created" << endl;
}
void Line::setLength( double len ) {
   length = len;
}
double Line::getLength( void ) {
   return length;
}

// Main function for the program
int main() {
   Line line;
 
   // set line length
   line.setLength(6.0); 
   cout << "Length of line : " << line.getLength() <<endl;
 
   return 0;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Object is being created
Length of line : 6

Constructor parametrizado

Un constructor predeterminado no tiene ningún parámetro, pero si lo necesita, un constructor puede tener parámetros. Esto le ayuda a asignar un valor inicial a un objeto en el momento de su creación, como se muestra en el siguiente ejemplo:

#include <iostream>
 
using namespace std;
class Line {
   public:
      void setLength( double len );
      double getLength( void );
      Line(double len);  // This is the constructor
 
   private:
      double length;
};
 
// Member functions definitions including 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( void ) {
   return length;
}

// Main function for the program
int main() {
   Line line(10.0);
 
   // get initially set length.
   cout << "Length of line : " << line.getLength() <<endl;
   
   // set line length again
   line.setLength(6.0); 
   cout << "Length of line : " << line.getLength() <<endl;
 
   return 0;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

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

Uso de listas de inicialización para inicializar campos

En el caso de un constructor parametrizado, puede utilizar la siguiente sintaxis para inicializar los campos:

Line::Line( double len): length(len) {
   cout << "Object is being created, length = " << len << endl;
}

La sintaxis anterior es igual a la siguiente sintaxis:

Line::Line( double len) {
   cout << "Object is being created, length = " << len << endl;
   length = len;
}

Si para una clase C, tiene varios campos X, Y, Z, etc., para inicializar, entonces use puede usar la misma sintaxis y separar los campos por comas de la siguiente manera:

C::C( double a, double b, double c): X(a), Y(b), Z(c) {
   ....
}

El destructor de clases

UNA destructor es una función miembro especial de una clase que se ejecuta siempre que un objeto de su clase sale del alcance o siempre que la expresión de eliminación se aplica a un puntero al objeto de esa clase.

Un destructor tendrá exactamente el mismo nombre que la clase prefijada con una tilde (~) y no puede devolver un valor ni tomar ningún parámetro. Destructor puede ser muy útil para liberar recursos antes de salir del programa, como cerrar archivos, liberar recuerdos, etc.

El siguiente ejemplo explica el concepto de destructor:

#include <iostream>
 
using namespace std;
class Line {
   public:
      void setLength( double len );
      double getLength( void );
      Line();   // This is the constructor declaration
      ~Line();  // This is the destructor: declaration
 
   private:
      double length;
};
 
// Member functions definitions including constructor
Line::Line(void) {
   cout << "Object is being created" << endl;
}
Line::~Line(void) {
   cout << "Object is being deleted" << endl;
}
void Line::setLength( double len ) {
   length = len;
}
double Line::getLength( void ) {
   return length;
}

// Main function for the program
int main() {
   Line line;
 
   // set line length
   line.setLength(6.0); 
   cout << "Length of line : " << line.getLength() <<endl;
 
   return 0;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

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