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 202 — #240<br />
✐<br />
Capítulo 6. Inicialización y limpieza<br />
El mismo problema ocurre si crea un objeto individual como éste:<br />
Y y4;<br />
Recuerde, si ti<strong>en</strong>e un constructor, el compilador asegura que siempre ocurrirá la<br />
construcción, sin t<strong>en</strong>er <strong>en</strong> cu<strong>en</strong>ta la situación.<br />
El constructor por defecto es tan importante que si (y sólo si) una estructura (struct<br />
o clase) no ti<strong>en</strong>e constructor, el compilador creará uno automáticam<strong>en</strong>te. Por<br />
ello, lo sigui<strong>en</strong>te funciona:<br />
//: C06:AutoDefaultConstructor.cpp<br />
// Automatically-g<strong>en</strong>erated default constructor<br />
class V {<br />
int i; // private<br />
}; // No constructor<br />
int main() {<br />
V v, v2[10];<br />
} ///:~<br />
Si se han definido constructores, pero no hay constructor por defecto, las instancias<br />
anteriores de V provocarán errores durante la compilación.<br />
Podría p<strong>en</strong>sarse que el constructor sintetizado por el compilador debería hacer<br />
alguna inicialización intelig<strong>en</strong>te, como poner a cero la memoria del objeto. Pero no<br />
lo hace - añadiría una sobrecarga que quedaría fuera del control del programador. Si<br />
quiere que la memoria sea inicializada a cero, debería hacerlo escribi<strong>en</strong>do un constructor<br />
por defecto explícito.<br />
Aunque el compilador creará un constructor por defecto, el comportami<strong>en</strong>to de<br />
ese constructor raram<strong>en</strong>te hará lo que se espera. Debería considerar esta característica<br />
como una red de seguridad, pero que debe usarse con moderación. En g<strong>en</strong>eral,<br />
debería definir sus constructores explicitam<strong>en</strong>te y no permitir que el compilador lo<br />
haga por usted.<br />
6.8. Resum<strong>en</strong><br />
202<br />
Los mecanismos apar<strong>en</strong>tem<strong>en</strong>te elaborados proporcionados por <strong>C++</strong> deberían<br />
darle una idea de la importancia crítica que ti<strong>en</strong>e <strong>en</strong> el l<strong>en</strong>guaje la inicialización y<br />
limpieza. Como Stroustrup fue qui<strong>en</strong> diseño <strong>C++</strong>, una de las primeras observaciones<br />
que hizo sobre la productividad de C fue que una parte importante de los problemas<br />
de programación se deb<strong>en</strong> a la inicialización inapropiada de las variables. Este<br />
tipo de errores son difíciles de <strong>en</strong>contrar, y otro tanto se puede decir de una limpieza<br />
inapropiada. Dado que constructores y destructores le permit<strong>en</strong> garantizar una<br />
inicialización y limpieza apropiada (el compilador no permitirá que un objeto sea<br />
creado o destruido sin la invocación del constructor y destructor correspondi<strong>en</strong>te),<br />
conseguirá control y seguridad.<br />
La inicialización de agregados está incluida de un modo similar - previ<strong>en</strong>e de<br />
errores de inicialización típicos con agregados de tipos básicos y hace que el código<br />
sea más corto.<br />
✐<br />
✐<br />
✐<br />
✐