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 193 — #231<br />

✐<br />

6.3. Eliminación del bloque de definiciones<br />

Hay que t<strong>en</strong>er cuidado con las variables locales que ocultan las variables del<br />

ámbito superior. En g<strong>en</strong>eral, usar el mismo nombre para una variable anidada y<br />

una variable que es global <strong>en</strong> ese ámbito es confuso y prop<strong>en</strong>so a errores 4<br />

Creo que los bloques pequeños son un indicador de un bu<strong>en</strong> diseño. Si una sola<br />

función requiere varias páginas, quizá está int<strong>en</strong>tando demasiadas cosas <strong>en</strong> esa función.<br />

Funciones de granularidad más fina no sólo son más útiles, tambíén facilitan la<br />

localización de errores.<br />

6.3.2. Alojami<strong>en</strong>to de memoria<br />

Ahora una variable se puede definir <strong>en</strong> cualquier parte del bloque, podría parecer<br />

que el alojami<strong>en</strong>to para una variable no se puede llevar a cabo hasta el mom<strong>en</strong>to<br />

<strong>en</strong> que se define. En realidad, lo más probable es que el compilador siga la práctica<br />

de pedir todo el alojami<strong>en</strong>to para el bloque <strong>en</strong> la llave de apertura del bloque. No<br />

importa porque, como programador, no puede acceder al espacio asociado (es decir,<br />

el objeto) hasta que ha sido definido 5 . Aunque el espacio se pida al comi<strong>en</strong>zo del<br />

bloque, la llamada al constructor no ocurre hasta el punto <strong>en</strong> el que se define el objeto<br />

ya que el id<strong>en</strong>tificador no está disponible hasta <strong>en</strong>tonces. El compilador incluso<br />

comprueba que no ponga la definición del objeto (y por tanto la llamada al constructor)<br />

<strong>en</strong> un punto que dep<strong>en</strong>da de una s<strong>en</strong>t<strong>en</strong>cia condicional, como <strong>en</strong> una s<strong>en</strong>t<strong>en</strong>cia<br />

switch o algún lugar que pueda saltar un goto. Descom<strong>en</strong>tar las s<strong>en</strong>t<strong>en</strong>cias del<br />

sigui<strong>en</strong>te código g<strong>en</strong>erará un error o aviso.<br />

//: C06:Nojump.cpp<br />

// Can’t jump past constructors<br />

class X {<br />

public:<br />

X();<br />

};<br />

X::X() {}<br />

void f(int i) {<br />

if(i < 10) {<br />

//! goto jump1; // Error: goto bypasses init<br />

}<br />

X x1; // Constructor called here<br />

jump1:<br />

switch(i) {<br />

case 1 :<br />

X x2; // Constructor called here<br />

break;<br />

//! case 2 : // Error: case bypasses init<br />

X x3; // Constructor called here<br />

break;<br />

}<br />

}<br />

int main() {<br />

f(9);<br />

f(11);<br />

4 El l<strong>en</strong>guaje Java considera esto una idea tan mala que lo considera un error.<br />

5 De acuerdo, probablem<strong>en</strong>te podría trucarlo usando punteros, pero sería muy, muy malo<br />

193<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!