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

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

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

Saved successfully!

Ooh no, something went wrong!