Jugando con Destructores en C++

Prediga la salida del fragmento de código siguiente.

#include <iostream>
using namespace std;
  
int i;
  
class A
{
public:
    ~A()
    {
        i=10;
    }
};
  
int foo()
{
    i=3;
    A ob;
    return i;
}
  
int main()
{
    cout << "i = " << foo() << endl;
    return 0;
}

La salida del programa anterior es «i = 3».
¿Por qué la salida es i= 3 y no 10?
Al regresar de una función, destructor es el último método que se ejecuta. Se llama al destructor para el objeto «ob» después de que el valor de i se copia al valor de retorno de la función. Entonces, antes de que el destructor pudiera cambiar el valor de i a 10, el valor actual de i se copia y, por lo tanto, la salida es i = 3.

¿Cómo hacer que el programa genere «i = 10»?
Las siguientes son dos formas de devolver el valor actualizado:

1) Devolución por referencia:
dado que la referencia da el valor l de la variable, al utilizar la devolución por referencia, el programa generará «i = 10».

#include <iostream>
using namespace std;
  
int i;
  
class A
{
public:
    ~A()
    {
        i = 10;
    }
};
  
int& foo()
{
    i = 3;
    A ob;
    return i;
}
  
int main()
{
    cout << "i = " << foo() << endl;
    return 0;
}

La función foo() devuelve el valor l de la variable i. Entonces, la dirección de i se copiará en el valor devuelto. Dado que, las referencias se desreferencian automáticamente. Dará como resultado «i = 10».

2. Crear el objeto ob en un ámbito de bloque

#include <iostream>
using namespace std;
  
int i;
  
class A
{
public:
    ~A()
    {
        i = 10;
    }
};
  
int foo()
{
    i = 3;
    {
        A ob;
    }
    return i;
}
  
int main()
{
    cout << "i = " << foo() << endl;
    return 0;
}

Dado que el objeto ob se crea en el alcance del bloque, se llamará al destructor del objeto después de que finalice el bloque, cambiando así el valor de i a 10. Finalmente, 10 se copiará en el valor de retorno.

Este artículo fue compilado por Aashish Barnwal y revisado por el equipo de GeeksforGeeks. 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 *