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

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

Saved successfully!

Ooh no, something went wrong!