Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 188 — #226<br />
✐<br />
Capítulo 6. Inicialización y limpieza<br />
6.1. Inicialización garantizada por el constructor<br />
Tanto la clase Stash como la Stack definidas previam<strong>en</strong>te ti<strong>en</strong><strong>en</strong> una función<br />
llamada initialize(). que como indica su nombre se debería llamar antes de<br />
usar el objeto. Desafortunadam<strong>en</strong>te, esto significa que el programador cli<strong>en</strong>te debe<br />
asegurar una inicialización apropiada. Los programadores cli<strong>en</strong>te son prop<strong>en</strong>sos a<br />
olvidar detalles como la inicialización cuando ti<strong>en</strong><strong>en</strong> prisa por hacer que la librería<br />
resuelva sus problemas. En <strong>C++</strong>, la inicialización <strong>en</strong> demasiado importante como<br />
para dejársela al programador cli<strong>en</strong>te. El diseñador de la clase puede garantizar la<br />
inicialización de cada objeto facilitando una función especial llamada constructor. Si<br />
una clase ti<strong>en</strong>e un constructor, el compilador hará que se llame automáticam<strong>en</strong>te al<br />
constructor <strong>en</strong> el mom<strong>en</strong>to de la creación del objeto, antes de que el programador<br />
cli<strong>en</strong>te pueda llegar a tocar el objeto. La invocación del constructor no es una opción<br />
para el programador cli<strong>en</strong>te; es realizada por el compilador <strong>en</strong> el punto <strong>en</strong> el que se<br />
define el objeto.<br />
El sigui<strong>en</strong>te reto es cómo llamar a esta función. Hay dos cuestiones. La primera<br />
es que no debería ser ningún nombre que pueda querer usar para un miembro de<br />
la clase. La segunda es que dado que el compilador es el responsable de la invocación<br />
del constructor, siempre debe saber qué función llamar. La solución elegida<br />
por Stroustrup parece ser la más s<strong>en</strong>cilla y lógica: el nombre del constructor es el<br />
mismo que el de la clase. Eso hace que t<strong>en</strong>ga s<strong>en</strong>tido que esa función sea invocada<br />
automáticam<strong>en</strong>te <strong>en</strong> la inicialización.<br />
Aquí se muestra un clase s<strong>en</strong>cilla con un constructor:<br />
class X {<br />
int i;<br />
public:<br />
X(); // Constructor<br />
};<br />
Ahora, se define un objeto,<br />
void f() {<br />
X a;<br />
// ...<br />
}<br />
Lo mismo pasa si a fuese un <strong>en</strong>tero: se pide alojami<strong>en</strong>to para el objeto. Pero cuando<br />
el programa llega al punto de ejecución <strong>en</strong> el que se define a, se invoca el constructor<br />
automáticam<strong>en</strong>te. Es decir, el compilador inserta la llamada a X::X() para el<br />
objeto a <strong>en</strong> el punto de la definición. Como cualquier método, el primer argum<strong>en</strong>to<br />
(secreto) para el constructor es el puntero this - la dirección del objeto al que corresponde<br />
ese método. En el caso del constructor, sin embargo, this apunta a un bloque<br />
de memoria no inicializado, y el trabajo del constructor es inicializar esa memoria de<br />
forma adecuada.<br />
Como cualquier función, el constructor puede tomar argum<strong>en</strong>tos que permitan<br />
especificar cómo ha de crearse el objeto, dados unos valores de inicialización. Los<br />
argum<strong>en</strong>tos del constructor son una especie de garantía de que todas las partes del<br />
objeto se inicializan con valores apropiados. Por ejemplo, si una clase Tree 1 ti<strong>en</strong>e<br />
un constructor que toma como argum<strong>en</strong>to un único <strong>en</strong>tero que indica la altura del<br />
1 árbol<br />
188<br />
✐<br />
✐<br />
✐<br />
✐