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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

✐<br />

✐<br />

✐<br />

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

✐<br />

11: Las refer<strong>en</strong>cias y el constructor<br />

de copia<br />

Las refer<strong>en</strong>cias son como punteros constantes que el compilador<br />

de-refer<strong>en</strong>cia automáticam<strong>en</strong>te.<br />

Aunque las refer<strong>en</strong>cias también exist<strong>en</strong> <strong>en</strong> Pascal, la versión de <strong>C++</strong> se tomó del<br />

l<strong>en</strong>guaje Algol. Las refer<strong>en</strong>cias son es<strong>en</strong>ciales <strong>en</strong> <strong>C++</strong> para ayudar <strong>en</strong> la sintaxis de<br />

los operadores sobrecargados (vea el capítulo 12) y, además, son una bu<strong>en</strong>a forma<br />

para controlar la manera <strong>en</strong> que los argum<strong>en</strong>tos se pasan a las funciones tanto hacia<br />

d<strong>en</strong>tro como hacia fuera.<br />

En este capítulo primero verá la difer<strong>en</strong>cia <strong>en</strong>tre los punteros <strong>en</strong> C y <strong>en</strong> <strong>C++</strong>, y<br />

luego se pres<strong>en</strong>tarán las refer<strong>en</strong>cias. Pero la mayor parte del capítulo ahondará <strong>en</strong> el<br />

asunto un tanto confuso para los programadores de <strong>C++</strong> novatos: el constructor de<br />

copia, un constructor especial (que usa refer<strong>en</strong>cias) y construye un nuevo objeto de<br />

otro ya exist<strong>en</strong>te del mismo tipo. El compilador utiliza el constructor de copia para<br />

pasar y retornar objetos por valor a las funciones.<br />

Finalm<strong>en</strong>te, se hablará sobre la característica (un tanto oscura) de los punteros-amiembro<br />

de <strong>C++</strong>.<br />

11.1. Punteros <strong>en</strong> <strong>C++</strong><br />

La difer<strong>en</strong>cia más importante <strong>en</strong>tre los punteros <strong>en</strong> C y <strong>en</strong> <strong>C++</strong> es que los de<br />

<strong>C++</strong> están fuertem<strong>en</strong>te tipados. Sobre todo <strong>en</strong> lo que al tipo void * se refiere. C no<br />

permite asignar un puntero de un tipo a otro de forma casual, pero sí permite hacerlo<br />

mediante un void *. Por ejemplo,<br />

Bird* b;<br />

Rock* r;<br />

void* v;<br />

v = r;<br />

b = v;<br />

A causa de esta «característica» de C, puede utilizar cualquier tipo como si de<br />

otro se tratara sin ningún aviso por parte del compilador. <strong>C++</strong> no permite hacer esto;<br />

el compilador da un m<strong>en</strong>saje de error, y si realm<strong>en</strong>te quiere utilizar un tipo como otro<br />

difer<strong>en</strong>te, debe hacerlo explícitam<strong>en</strong>te, tanto para el compilador como para el lector,<br />

usando molde (cast <strong>en</strong> inglés). (En el capítulo 3 se habló sobre la sintaxis mejorada<br />

del molde «explícito»).<br />

307<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!