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

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

arco.esi.uclm.es
from arco.esi.uclm.es More from this publisher
13.01.2015 Views

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 192 — #230 ✐ Capítulo 6. Inicialización y limpieza }; G::G(int ii) { i = ii; } int main() { cout > retval; require(retval != 0); int y = retval + 3; G g(y); } ///:~ Puede ver que se ejecuta parte del código, entonces se define >retval, que se usa para capturar datos de la consola, y entonces se definen y y g. C, al contrario, no permite definir una variable en ningún sitio que no sea el comienzo de un bloque. En general, debería definir las variables tan cerca como sea posible del punto en que se usa, e inicializarlas siempre cuando se definen. (Ésta es una sugerencia de estilo para tipos básicos, en los que la inicialización es opcional.) Es una cuestión de seguridad. Reduciendo la duración de disponibilidad al bloque, se reduce la posibilidad de que sea usada inapropiadamente en otra parte del bloque. En resumen, la legibilidad mejora porque el lector no teiene que volver al inicio del bloque para ver el tipo de una variable. 6.3.1. Bucles for En C++, a menudo verá bucles for con el contador definido dentro de la propia expresión. for (int j = 0; j < 100; j++) { cout

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 193 — #231 ✐ 6.3. Eliminación del bloque de definiciones Hay que tener cuidado con las variables locales que ocultan las variables del ámbito superior. En general, usar el mismo nombre para una variable anidada y una variable que es global en ese ámbito es confuso y propenso a errores 4 Creo que los bloques pequeños son un indicador de un buen diseño. Si una sola función requiere varias páginas, quizá está intentando demasiadas cosas en esa función. Funciones de granularidad más fina no sólo son más útiles, tambíén facilitan la localización de errores. 6.3.2. Alojamiento de memoria Ahora una variable se puede definir en cualquier parte del bloque, podría parecer que el alojamiento para una variable no se puede llevar a cabo hasta el momento en que se define. En realidad, lo más probable es que el compilador siga la práctica de pedir todo el alojamiento para el bloque en la llave de apertura del bloque. No importa porque, como programador, no puede acceder al espacio asociado (es decir, el objeto) hasta que ha sido definido 5 . Aunque el espacio se pida al comienzo del bloque, la llamada al constructor no ocurre hasta el punto en el que se define el objeto ya que el identificador no está disponible hasta entonces. El compilador incluso comprueba que no ponga la definición del objeto (y por tanto la llamada al constructor) en un punto que dependa de una sentencia condicional, como en una sentencia switch o algún lugar que pueda saltar un goto. Descomentar las sentencias del siguiente código generará un error o aviso. //: C06:Nojump.cpp // Can’t jump past constructors class X { public: X(); }; X::X() {} void f(int i) { if(i < 10) { //! goto jump1; // Error: goto bypasses init } X x1; // Constructor called here jump1: switch(i) { case 1 : X x2; // Constructor called here break; //! case 2 : // Error: case bypasses init X x3; // Constructor called here break; } } int main() { f(9); f(11); 4 El lenguaje Java considera esto una idea tan mala que lo considera un error. 5 De acuerdo, probablemente podría trucarlo usando punteros, pero sería muy, muy malo 193 ✐ ✐ ✐ ✐

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 192 — #230<br />

✐<br />

Capítulo 6. Inicialización y limpieza<br />

};<br />

G::G(int ii) { i = ii; }<br />

int main() {<br />

cout > retval;<br />

require(retval != 0);<br />

int y = retval + 3;<br />

G g(y);<br />

} ///:~<br />

Puede ver que se ejecuta parte del código, <strong>en</strong>tonces se define >retval, que se<br />

usa para capturar datos de la consola, y <strong>en</strong>tonces se defin<strong>en</strong> y y g. C, al contrario, no<br />

permite definir una variable <strong>en</strong> ningún sitio que no sea el comi<strong>en</strong>zo de un bloque.<br />

En g<strong>en</strong>eral, debería definir las variables tan cerca como sea posible del punto <strong>en</strong><br />

que se usa, e inicializarlas siempre cuando se defin<strong>en</strong>. (Ésta es una suger<strong>en</strong>cia de<br />

estilo para tipos básicos, <strong>en</strong> los que la inicialización es opcional.) Es una cuestión de<br />

seguridad. Reduci<strong>en</strong>do la duración de disponibilidad al bloque, se reduce la posibilidad<br />

de que sea usada inapropiadam<strong>en</strong>te <strong>en</strong> otra parte del bloque. En resum<strong>en</strong>, la<br />

legibilidad mejora porque el lector no tei<strong>en</strong>e que volver al inicio del bloque para ver<br />

el tipo de una variable.<br />

6.3.1. Bucles for<br />

En <strong>C++</strong>, a m<strong>en</strong>udo verá bucles for con el contador definido d<strong>en</strong>tro de la propia<br />

expresión.<br />

for (int j = 0; j < 100; j++) {<br />

cout

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

Saved successfully!

Ooh no, something went wrong!