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