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