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 323 — #361<br />

✐<br />

11.4. Punteros a miembros<br />

int main() {<br />

NoCC n;<br />

//! f(n); // Error: copy-constructor called<br />

//! NoCC n2 = n; // Error: c-c called<br />

//! NoCC n3(n); // Error: c-c called<br />

} ///:~<br />

Note la utilización de la forma más g<strong>en</strong>eral<br />

NoCC(const NoCC&);<br />

utilizando const<br />

Funciones que modifican objetos externos<br />

La sintaxis de refer<strong>en</strong>cias es más agradable que la de punteros, aunque oculte<br />

significado al que lea el código fu<strong>en</strong>te. Por ejemplo, <strong>en</strong> la librería iostreams existe<br />

una versión sobrecargada de la función get() que ti<strong>en</strong>e como argum<strong>en</strong>to un char<br />

&, y su cometido es modificar ese argum<strong>en</strong>to y utilizarlo como el valor que retorna<br />

get(). No obstante, si lee el código fu<strong>en</strong>te de esta función, no es inmediatam<strong>en</strong>te<br />

obvio que la variable que se pasa como argum<strong>en</strong>to vaya a ser modificada:<br />

char c;<br />

cin.get(c);<br />

Parece que a la función se le pasa por valor, lo que sugiere que el argum<strong>en</strong>to que<br />

se pasa no se modifica.<br />

A causa de esto, es probablem<strong>en</strong>te más seguro, desde el punto de vista de mant<strong>en</strong>imi<strong>en</strong>to<br />

del código fu<strong>en</strong>te, utilizar punteros que pas<strong>en</strong> la dirección del argum<strong>en</strong>to<br />

que se desee modificar. Si siempre pasa direcciones como refer<strong>en</strong>cias constantes excepto<br />

cuando int<strong>en</strong>ta modificar el argum<strong>en</strong>to que se pasa a través de la dirección, donde<br />

pasaría un puntero no constante, <strong>en</strong>tonces es más fácil para el lector seguir el código<br />

fu<strong>en</strong>te.<br />

11.4. Punteros a miembros<br />

Un puntero es una variable que conti<strong>en</strong>e la dirección de alguna ubicación. Se puede<br />

cambiar a lo que el puntero apunta <strong>en</strong> tiempo de ejecución. La ubicación a la que<br />

apunta puede ser un dato o función. El puntero a miembro de <strong>C++</strong> sigue el mismo concepto,<br />

excepto que a lo que apunta es una ubicación d<strong>en</strong>tro de una clase. Pero surge<br />

el dilema de que un puntero necesita una dirección, pero no hay «dirección» alguna<br />

d<strong>en</strong>tro de una clase; La selección de un miembro de una clase se realiza mediante un<br />

desplazami<strong>en</strong>to d<strong>en</strong>tro de la clase. Pero primero hay que conocer la dirección donde<br />

comi<strong>en</strong>za un objeto <strong>en</strong> particular para luego sumarle el desplazami<strong>en</strong>to y así localizar<br />

el miembro de la clase. La sintaxis de los punteros a miembros requiere que usted<br />

seleccione un objeto al mismo tiempo que está accedi<strong>en</strong>do al cont<strong>en</strong>ido del puntero<br />

al miembro.<br />

Para <strong>en</strong>t<strong>en</strong>der esta sintaxis, considere una estructura simple, con un puntero s-<br />

p y un objeto so. Puede seleccionar sus miembros de la misma manera que <strong>en</strong> el<br />

323<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!