Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 189 — #227<br />
✐<br />
6.2. Limpieza garantizada por el destructor<br />
árbol, <strong>en</strong>tonces debe crear un objeto árbol como éste:<br />
Tree t(12)<br />
// árbol de 12 metros<br />
Si Tree(int) es el único constructor, el compilador no le permitirá crear un<br />
objeto de otro modo. (En el próximo capítulo veremos cómo crear múltiples constructores<br />
y difer<strong>en</strong>tes maneras para invocarlos.)<br />
Y realm<strong>en</strong>te un constructor no es más que eso; es una función con un nombre especial<br />
que se invoca automáticam<strong>en</strong>te por el compilador para cada objeto <strong>en</strong> el mom<strong>en</strong>to<br />
de su creación. A pesar de su simplicidad, ti<strong>en</strong>e un valor excepcional porque<br />
evita una gran cantidad de problemas y hace que el código sea más fácil de escribir<br />
y leer. En el fragm<strong>en</strong>to de código anterior, por ejemplo, no hay una llamada explícita<br />
a ninguna función initilize() que, conceptualm<strong>en</strong>te es una función separada de<br />
la definición. En <strong>C++</strong>, la definición e inicialización son conceptos unificados - no se<br />
puede t<strong>en</strong>er el uno si el otro.<br />
Constructor y destructor son tipos de funciones muy inusuales: no ti<strong>en</strong><strong>en</strong> valor<br />
de retorno. Esto es distinto de t<strong>en</strong>er valor de retorno void, que indicaría que la función<br />
no retorna nada pero t<strong>en</strong>i<strong>en</strong>do la posibilidad de hacer otra cosa. Constructores<br />
y destructores no retornan nada y no hay otra posibilidad. El acto de traer un objeto<br />
al programa, o sacarlo de él es algo especial, como el nacimi<strong>en</strong>to o la muerte, y el<br />
compilador siempre hace que la función se llame a si misma, para asegurarse de que<br />
ocurre realm<strong>en</strong>te. Si hubiera un valor de retorno, y usted pudiera elegir uno propio,<br />
el compilador no t<strong>en</strong>dría forma de saber qué hacer con el valor retornado, o el programador<br />
cli<strong>en</strong>te t<strong>en</strong>dría que disponer de una invocación explícita del constructor o<br />
destructor, lo que eliminaría la seguridad.<br />
6.2. Limpieza garantizada por el destructor<br />
Como un programador C, a m<strong>en</strong>udo p<strong>en</strong>sará sobre lo importante de la inicialización,<br />
pero rara vez pi<strong>en</strong>sa <strong>en</strong> la limpieza. Después de todo, ¿qué hay que limpiar de<br />
un int Simplem<strong>en</strong>te, olvidarlo. Sin embargo, con las librerías, «dejarlo pasar» <strong>en</strong> un<br />
objeto cuando ya no lo necesita no es seguro. Qué ocurre si ese objeto modifica algo<br />
<strong>en</strong> el hardware, o escribe algo <strong>en</strong> pantalla, o ti<strong>en</strong>e asociado espacio <strong>en</strong> el montículo(heap).<br />
Si simplem<strong>en</strong>te pasa de él, su objeto nunca logrará salir de este mundo. En<br />
<strong>C++</strong>, la limpieza es tan importante como la inicialización y por eso está garantizada<br />
por el destructor.<br />
La sintaxis del destructor es similar a la del constructor: se usa el nombre de<br />
la clase como nombre para la función. Sin embargo, el destructor se distingue del<br />
constructor porque va precedido de una virgulilla (~). Además, el destructor nunca<br />
ti<strong>en</strong>e argum<strong>en</strong>tos porque la destrucción nunca necesita ninguna opción. Aquí hay<br />
una declaración de un destructor:<br />
class Y {<br />
public:<br />
~Y();<br />
};<br />
El destructor se invoca automáticam<strong>en</strong>te por el compilador cuando el objeto sale<br />
del ámbito. Puede ver dónde se invoca al constructor por el punto de la definición<br />
del objeto, pero la única evid<strong>en</strong>cia de que el destructor fue invocado es la llave de<br />
cierre del ámbito al que pert<strong>en</strong>ece el objeto. El constructor se invoca incluso aunque<br />
189<br />
✐<br />
✐<br />
✐<br />
✐