¿Es posible llamar al constructor y al destructor explícitamente en C++?

Un constructor es una función miembro especial a la que el compilador llama automáticamente cuando se crea un objeto y el destructor también es una función miembro especial a la que también llama implícitamente el compilador cuando el objeto sale del alcance. También se les llama cuando un objeto asignado dinámicamente se asigna y destruye, un operador nuevo asigna almacenamiento y llama al constructor, elimina las llamadas del operador al destructor y libera la memoria asignada por nuevo. 

¿Es posible llamar al constructor y al destructor explícitamente? 

Sí, el programador puede llamar explícitamente a funciones miembro especiales. 

Ejemplo:

CPP

// C++ program to demonstrate an explicit call
#include <iostream>
using namespace std;
  
class Test {
public:
    Test() { cout << "Constructor is executed\n"; }
    ~Test() { cout << "Destructor is executed\n"; }
};
  
int main()
{
    Test(); // Explicit call to constructor
    Test t; // local object
    t.~Test(); // Explicit call to destructor
    return 0;
}

Producción:

Constructor is executed
Destructor is executed
Constructor is executed
Destructor is executed
Destructor is executed 

Cuando se llama explícitamente al constructor, el compilador crea un objeto temporal sin nombre y se destruye inmediatamente. Es por eso que la segunda línea en la salida se llama destructor. 

Aquí hay una conversación entre el Dr. Bjarne Stroustrup y yo por correo electrónico sobre este tema:

Yo: ¿Por qué C++ permite llamar al constructor explícitamente? ¿No crees que esto no debería ser así? 

Dr. Bjarne: No. Los objetos temporales de los tipos de clase son útiles. 

Una vez que se invoca un destructor para un objeto, el objeto ya no existe; el comportamiento no está definido si se invoca el destructor para un objeto cuya vida útil ha terminado [Ejemplo: si se invoca explícitamente el destructor para un objeto automático y el bloque se deja posteriormente de una manera que normalmente invocaría la destrucción implícita del objeto, el el comportamiento es indefinido. —fin del ejemplo]. 

  • Nunca deberíamos llamar al destructor explícitamente en un objeto local (automático) porque se pueden obtener resultados realmente malos al hacerlo. 
  • El compilador destruye automáticamente los objetos locales cuando quedan fuera del alcance y esta es la garantía del lenguaje C++. 

En general, las funciones miembro especiales no deben llamarse explícitamente. El constructor y el destructor también se pueden llamar desde la función miembro de la clase. 

Ejemplo:

CPP

// C++ program to demonstrate an explicit call of destructor
#include <iostream>
using namespace std;
  
class Test {
public:
    Test() { cout << "Constructor is executed\n"; }
    ~Test() { cout << "Destructor is executed\n"; }
    void show()
    {
        Test();
        this->Test::~Test();
    }
};
  
int main()
{
    Test t;
    t.show();
    return 0;
}

Producción:

Constructor is executed
Constructor is executed
Destructor is executed
Destructor is executed
Destructor is executed

Una llamada explícita a destructor solo es necesaria cuando un objeto se coloca en una ubicación particular en la memoria utilizando la ubicación nueva. Destructor no debe llamarse explícitamente cuando el objeto se asigna dinámicamente porque el operador de eliminación llama automáticamente a destructor. 

Ejemplo: 

CPP

#include <iostream>
using namespace std;
  
class Test {
public:
    Test() { cout << "Constructor is executed\n"; }
    ~Test() { cout << "Destructor is executed\n"; }
    friend void fun(Test t);
};
void fun(Test t)
{
    Test();
    t.~Test();
}
int main()
{
    Test();
    Test t;
    fun(t);
    return 0;
}

Producción:

Constructor is executed
Destructor is executed
Constructor is executed
Constructor is executed
Destructor is executed
Destructor is executed
Destructor is executed
Destructor is executed

Este artículo es una contribución Conoce a Pravasi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *