13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

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 />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!