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