logo

Destructores in C++

¿Qué es un destructor?

Destructor es una función miembro de instancia que se invoca automáticamente cada vez que se va a destruir un objeto. Es decir, un destructor es la última función que se llamará antes de que se destruya un objeto.

  • Un destructor también es una función miembro especial como un constructor. El destructor destruye los objetos de clase creados por el constructor.
  • El destructor tiene el mismo nombre que el nombre de su clase precedido por un símbolo de tilde (~).
  • No es posible definir más de un destructor.
  • El destructor es sólo una forma de destruir el objeto creado por el constructor. Por lo tanto, el destructor no se puede sobrecargar.
  • El destructor no requiere ningún argumento ni devuelve ningún valor.
  • Se llama automáticamente cuando un objeto sale del alcance.
  • El destructor libera el espacio de memoria ocupado por los objetos creados por el constructor.
  • En destructor, los objetos se destruyen al revés de la creación de un objeto.

Cabe señalar aquí que si el objeto se crea usando new o el constructor usa new para asignar memoria que reside en la memoria del montón o en el almacén libre, el destructor debe usar eliminar para liberar la memoria.

Sintaxis

La sintaxis para definir el destructor dentro de la clase:

~ () { // some instructions }>

La sintaxis para definir el destructor fuera de la clase:

 :: ~() { // some instructions }>

Ejemplo 1

El siguiente código demuestra la ejecución automática de constructores y destructores cuando se crean y destruyen objetos, respectivamente.

C++

shilpa shetty




// C++ program to demonstrate the execution of constructor> // and destructor> #include> using> namespace> std;> class> Test {> public>:> >// User-Defined Constructor> >Test() { cout <<>' Constructor executed'>; }> >// User-Defined Destructor> >~Test() { cout <<>' Destructor executed'>; }> };> main()> {> >Test t;> >return> 0;> }>

>

>

Producción

 Constructor executed Destructor executed>

Ejemplo 2

El siguiente código demuestra la ejecución automática de constructores y destructores cada vez que se crean y destruyen varios objetos, respectivamente.

C++




// C++ program to demonstrate the execution of constructor> // and destructor when multiple objects are created> #include> using> namespace> std;> class> Test {> public>:> >// User-Defined Constructor> >Test() { cout <<>' Constructor executed'>; }> >// User-Defined Destructor> >~Test() { cout <<>' Destructor executed'>; }> };> main()> {> >// Create multiple objects of the Test class> >Test t, t1, t2, t3;> >return> 0;> }>

>

>

Producción

 Constructor executed Constructor executed Constructor executed Constructor executed Destructor executed Destructor executed Destructor executed Destructor executed>

Ejemplo 3

El siguiente programa C++ demuestra la cantidad de veces que se llama a constructores y destructores.

C++




// C++ program to demonstrate the number of times> // constructor and destructors are called> #include> using> namespace> std;> static> int> Count = 0;>//It is static so that every class object has the same value> class> Test {> public>:> >// User-Defined Constructor> >Test()> >{> >// Number of times constructor is called> >Count++;> >cout <<>'No. of Object created: '> << Count> ><< endl;> >}> >// User-Defined Destructor> >~Test()> >{> > >cout <<>'No. of Object destroyed: '> << Count>//It will print count in> ><< endl;>//decending order> >Count--;> >// Number of times destructor is called> >}> };> // driver code> int> main()> {> >Test t, t1, t2, t3;> >return> 0;> }>

>

>

Producción

No. of Object created: 1 No. of Object created: 2 No. of Object created: 3 No. of Object created: 4 No. of Object destroyed: 4 No. of Object destroyed: 3 No. of Object destroyed: 2 No. of Object destroyed: 1>

Nota: Los objetos se destruyen en el orden inverso al de su creación. En este caso, t3 es el primero en ser destruido, mientras que t es el último.

Propiedades del destructor

Las siguientes son las principales propiedades de Destructor:

  • La función destructora se invoca automáticamente cuando se destruyen los objetos.
  • No se puede declarar estático o constante.
  • El destructor no tiene argumentos.
  • No tiene tipo de devolución ni siquiera nula.
  • Un objeto de una clase con un Destructor no puede convertirse en miembro de la unión.
  • Se debe declarar un destructor en la sección pública de la clase.
  • El programador no puede acceder a la dirección del destructor.

¿Cuándo se llama al destructor?

Una función destructora se llama automáticamente cuando el objeto sale del alcance:

  1. la función termina
  2. el programa termina
  3. finaliza un bloque que contiene variables locales
  4. se llama un operador de eliminación

Nota: destructor También se puede llamar explícitamente para un objeto.

cadena subcadena java

¿Cómo llamar explícitamente a los destructores?

Podemos llamar a los destructores explícitamente usando la siguiente declaración:

object_name.~class_name()>

¿En qué se diferencian los destructores de las funciones miembro normales?

  • Los destructores tienen el mismo nombre que la clase precedido por una tilde (~)
  • Los destructores no aceptan ningún argumento y no devuelven nada.

C++




#include> using> namespace> std;> class> String {> private>:> >char>* s;> >int> size;> public>:> >String(>char>*);>// constructor> >~String();>// destructor> };> String::String(>char>* c)> {> >size =>strlen>(c);> >s =>new> char>[size + 1];> >strcpy>(s, c);> }> String::~String() {>delete>[] s; }> int> main()> {> >String str =>'Hello, World!'>;> >String myString(str);> >cout <<>'String: '> << myString.s << endl;> >return> 0;> }>

>

>

¿Puede haber más de un destructor en una clase?

No, solo puede haber un destructor en una clase con un nombre de clase precedido por ~, sin parámetros y sin tipo de retorno.

¿Cuándo necesitamos escribir un destructor definido por el usuario?

Si no escribimos nuestro propio destructor en la clase, el compilador crea un destructor predeterminado para nosotros. El destructor predeterminado funciona bien a menos que hayamos asignado memoria o puntero dinámicamente en la clase. Cuando una clase contiene un puntero a la memoria asignada en la clase, debemos escribir un destructor para liberar memoria antes de que se destruya la instancia de la clase. Esto debe hacerse para evitar pérdidas de memoria.

¿Puede un destructor ser virtual?

Sí, de hecho, siempre es una buena idea hacer que los destructores sean virtuales en la clase base cuando tenemos una función virtual. Ver destructor virtual para más detalles.

Quizás le interese realizar una prueba sobre destructores.

Artículos relacionados