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 228 — #266<br />
✐<br />
Capítulo 8. Constantes<br />
8.2. Punteros<br />
Los punteros pued<strong>en</strong> ser constantes. El compilador pondrá más esfuerzo aún<br />
para evitar el almac<strong>en</strong>ami<strong>en</strong>to y hacer expansión de constantes cuando se trata de<br />
punteros constantes, pero estas características parec<strong>en</strong> m<strong>en</strong>os útiles <strong>en</strong> este caso. Lo<br />
más importante es que el compilador le avisará si int<strong>en</strong>ta cambiar un puntero constante,<br />
lo que repres<strong>en</strong>ta un bu<strong>en</strong> elem<strong>en</strong>to de seguridad. Cuando se usa const con<br />
punteros ti<strong>en</strong>e dos opciones: se pued<strong>en</strong> aplicar a lo que apunta el puntero o a la propia<br />
dirección almac<strong>en</strong>ada <strong>en</strong> el puntero. La sintaxis es un poco confusa al principio<br />
pero se vuelve cómodo con la práctica.<br />
8.2.1. Puntero a constante<br />
El truco con la definición de un puntero, al igual que con una definición complicada,<br />
es leerla empezando por el id<strong>en</strong>tificador e ir analizando la definición hacia<br />
afuera. El especificador const está ligado a la cosa «más cercana». Así que si se<br />
quiere impedir cambios <strong>en</strong> el elem<strong>en</strong>to apuntado, escribe una definición parecida a<br />
esta:<br />
const int* u;<br />
Empezando por el id<strong>en</strong>tificador, se lee «u es un puntero, que apunta a un <strong>en</strong>tero<br />
constante». En este caso no se requiere inicialización porque está dici<strong>en</strong>do que u puede<br />
apuntar a cualquier cosa (es decir, no es constante), pero la cosa a la que apunta<br />
no puede cambiar.<br />
Ahora vi<strong>en</strong>e la parte confusa. Podría p<strong>en</strong>sar que hacer el puntero inalterable <strong>en</strong><br />
si mismo, es decir, impedir cualquier cambio <strong>en</strong> la dirección que conti<strong>en</strong>e u, es tan<br />
simple como mover la palabra const al otro lado de la palabra int:<br />
int const* v;<br />
y p<strong>en</strong>sar que esto debería leerse «v es un puntero constante a un <strong>en</strong>tero». Sin embargo,<br />
la forma de leerlo es «v es un puntero ordinario a un <strong>en</strong>tero que es constante».<br />
Es decir, la palabra const se refiere de nuevo al <strong>en</strong>tero y el efecto es el mismo que<br />
<strong>en</strong> la definición previa. El hecho de que estas definiciones sean equival<strong>en</strong>tes es confuso,<br />
para evitar esta confusión por parte del lector del código, debería ceñirse a la<br />
primera forma.<br />
8.2.2. Puntero constante<br />
Para conseguir que el puntero sea inalterable, debe colocar el especificador const<br />
a la derecha del *:<br />
int d = 1;<br />
int * const w = &d;<br />
Ahora, se lee «w es un puntero constate, y apunta a un <strong>en</strong>tero». Como el puntero<br />
<strong>en</strong> sí es ahora una constante, el compilador obliga a darle un valor inicial que no<br />
podrá alterarse durante la vida del puntero. En cualquier caso, puede cambiar el<br />
valor de lo que apunta el puntero con algo como:<br />
228<br />
✐<br />
✐<br />
✐<br />
✐