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

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

Saved successfully!

Ooh no, something went wrong!