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

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

Saved successfully!

Ooh no, something went wrong!