Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 324 — #362<br />
✐<br />
Capítulo 11. Las refer<strong>en</strong>cias y el constructor de copia<br />
sigui<strong>en</strong>te ejemplo:<br />
//: C11:SimpleStructure.cpp<br />
struct Simple { int a; };<br />
int main() {<br />
Simple so, *sp = &so;<br />
sp->a;<br />
so.a;<br />
} ///:~<br />
Ahora suponga que ti<strong>en</strong>e un puntero normal que se llama ip y que apunta a un<br />
<strong>en</strong>tero. Para acceder a lo que apunta ip, ha de estar precedido por un ’*’:<br />
*ip=4;<br />
Finalm<strong>en</strong>te, se preguntará qué pasa si ti<strong>en</strong>e un puntero que está apuntando a<br />
algo que está d<strong>en</strong>tro de un objeto, incluso si lo que realm<strong>en</strong>te repres<strong>en</strong>ta es un desplazami<strong>en</strong>to<br />
d<strong>en</strong>tro del objeto. Para acceder a lo que está apuntando, debe preceder<br />
el puntero con ’*’. Pero como es un desplazami<strong>en</strong>to d<strong>en</strong>tro de un objeto, también ha<br />
de referirse al objeto con el que estamos tratando. Así, el * se combina con el objeto.<br />
Por tanto, la nueva sintaxis se escribe ->* para un puntero que apunta a un objeto, y<br />
.* para un objeto o refer<strong>en</strong>cia, tal como esto:<br />
objectPointer->*pointerToMember = 47;<br />
object.*pointerToMember = 47;<br />
Pero, ¿cuál es la sintaxis para definir el pointerToMember Pues como cualquier<br />
puntero, ti<strong>en</strong>e que decir el tipo al que apuntará, por lo que se utilizaría el ’*’ <strong>en</strong><br />
la definición. La única difer<strong>en</strong>cia es que debe decir a qué clase de objetos apuntará<br />
ese atributo puntero. Obviam<strong>en</strong>te, esto se consigue con el nombre de la clase y el<br />
operador de resolución de ámbito. Así,<br />
int ObjectClass::*pointerToMember;<br />
define un atributo puntero llamado pointerToMember que apunta a cualquier<br />
<strong>en</strong>tero d<strong>en</strong>tro de ObjectClass. También puede inicializar el puntero cuando lo<br />
defina (o <strong>en</strong> cualquier otro mom<strong>en</strong>to):<br />
int ObjectClass::*pointerToMember = &ObjectClass::a;<br />
Realm<strong>en</strong>te no existe una «dirección» de ObjectClass::a porque se está refiri<strong>en</strong>do<br />
a la clase y no a un objeto de esa clase. Así, &ObjectClass::a se puede<br />
utilizar sólo con la sintaxis de un puntero a miembro.<br />
He aquí un ejemplo que muestra cómo crear y utilizar punteros a atributos:<br />
//: C11:PointerToMemberData.cpp<br />
#include <br />
using namespace std;<br />
class Data {<br />
324<br />
✐<br />
✐<br />
✐<br />
✐