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 319 — #357<br />
✐<br />
11.3. El constructor de copia<br />
líneas <strong>en</strong> el archivo, se trunca a un <strong>en</strong>tero y se añade uno al valor resultante, eso<br />
determinará el ancho máximo <strong>en</strong> dígitos que un número de línea puede t<strong>en</strong>er.<br />
Nótese que hay un par de llamadas extrañas d<strong>en</strong>tro del bucle for: setf() y<br />
width(). Hay llamadas de ostream que permit<strong>en</strong> controlar, <strong>en</strong> este caso, la justificación<br />
y anchura de la salida. Sin embargo se debe llamar cada vez que se imprime<br />
línea y por eso están d<strong>en</strong>tro del bucle for. El Volum<strong>en</strong> 2 de este libro ti<strong>en</strong>e un capítulo<br />
<strong>en</strong>tero que explica los iostreams y que cu<strong>en</strong>ta más sobre estas llamadas así<br />
como otras formas de controlar los iostreams.<br />
Cuando se aplica Lin<strong>en</strong>um.cpp a HowMany2.out, resulta:<br />
1) HowMany2()<br />
2) h: objectCount = 1<br />
3) Entering f()<br />
4) HowMany2(const HowMany2&)<br />
5) h copy: objectCount = 2<br />
6) x argum<strong>en</strong>t inside f()<br />
7) h copy: objectCount = 2<br />
8) Returning from f()<br />
9) HowMany2(const HowMany2&)<br />
10) h copy copy: objectCount = 3<br />
11) ~HowMany2()<br />
12) h copy: objectCount = 2<br />
13) h2 after call to f()<br />
14) h copy copy: objectCount = 2<br />
15) Call f(), no return value<br />
16) HowMany2(const HowMany2&)<br />
17) h copy: objectCount = 3<br />
18) x argum<strong>en</strong>t inside f()<br />
19) h copy: objectCount = 3<br />
20) Returning from f()<br />
21) HowMany2(const HowMany2&)<br />
22) h copy copy: objectCount = 4<br />
23) ~HowMany2()<br />
24) h copy: objectCount = 3<br />
25) ~HowMany2()<br />
26) h copy copy: objectCount = 2<br />
27) After call to f()<br />
28) ~HowMany2()<br />
29) h copy copy: objectCount = 1<br />
30) ~HowMany2()<br />
31) h: objectCount = 0<br />
Como se esperaba, la primera cosa que ocurre es que para h se llama al constructor<br />
normal, el cual increm<strong>en</strong>ta el contador de objetos a uno. Pero <strong>en</strong>tonces, mi<strong>en</strong>tras<br />
se <strong>en</strong>tra <strong>en</strong> f(), el compilador llama sil<strong>en</strong>ciosam<strong>en</strong>te al constructor de copia para hacer<br />
el paso por valor. Se crea un nuevo objeto, que es copia de h (y por tanto t<strong>en</strong>drá<br />
el id<strong>en</strong>tificador «h copy») d<strong>en</strong>tro del ámbito de la función f(). Así pues, el contador<br />
de objetos se increm<strong>en</strong>ta a dos, por cortesía del constructor de copia.<br />
La línea ocho indica el principio del retorno de f(). Pero antes de que se destruya<br />
la variable local «h copy» (pues sale de ámbito al final de la función), se debe copiar<br />
al valor de retorno, que es h2. Por tanto h2, que no estaba creado previam<strong>en</strong>te, se<br />
crea de un objeto ya exist<strong>en</strong>te (la variable local d<strong>en</strong>tro de f()) y el constructor de<br />
copia vuelve a utilizarse <strong>en</strong> la línea 9. Ahora el id<strong>en</strong>tificador de h2 es «h copy copy»<br />
porque copió el id<strong>en</strong>tificador de la variable local de f(). Cuando se devuelve el<br />
objeto, pero antes de que la función termine, el contador de objetos se increm<strong>en</strong>ta<br />
temporalm<strong>en</strong>te a tres, pero la variable local con id<strong>en</strong>tificador «h copy» se destruye,<br />
disminuy<strong>en</strong>do a dos. Después de que se complete la llamada a f() <strong>en</strong> la línea 13,<br />
sólo hay dos objetos, h y h2, y puede comprobar, de hecho, que h2 terminó con el<br />
id<strong>en</strong>tificador «h copy copy».<br />
319<br />
✐<br />
✐<br />
✐<br />
✐