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

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 226 — #264<br />

✐<br />

Capítulo 8. Constantes<br />

permite al compilador g<strong>en</strong>erar código más efici<strong>en</strong>te ahorrando espacio de almac<strong>en</strong>ami<strong>en</strong>to<br />

y lecturas de memoria <strong>en</strong> la ejecución del programa.<br />

8.1.3. Vectores<br />

Es posible usar constantes para los vectores, pero prácticam<strong>en</strong>te está dando por<br />

hecho que el compilador no será lo sufici<strong>en</strong>tem<strong>en</strong>te sofisticado para mant<strong>en</strong>er un<br />

vector <strong>en</strong> la tabla de símbolos, así que le asignará espacio de almac<strong>en</strong>ami<strong>en</strong>to. En<br />

estas situaciones, const significa «un conjunto de datos <strong>en</strong> memoria que no pued<strong>en</strong><br />

modificarse». En cualquier caso, sus valores no puede usarse <strong>en</strong> tiempo de compilación<br />

porque el compilador no conoce <strong>en</strong> ese mom<strong>en</strong>to los cont<strong>en</strong>idos de las variables<br />

que ti<strong>en</strong><strong>en</strong> espacio asignado. En el código sigui<strong>en</strong>te puede ver algunas declaraciones<br />

incorrectas.<br />

//: C08:Constag.cpp<br />

// Constants and aggregates<br />

const int i[] = { 1, 2, 3, 4 };<br />

//! float f[i[3]]; // Illegal<br />

struct S { int i, j; };<br />

const S s[] = { { 1, 2 }, { 3, 4 } };<br />

//! double d[s[1].j]; // Illegal<br />

int main() {} ///:~<br />

En la definición de un vector, el compilador debe ser capaz de g<strong>en</strong>erar código<br />

que mueva el puntero de pila para dar cabida al vector. En las definiciones incorrectas<br />

anteriores, el compilador se queja porque no puede <strong>en</strong>contrar una expresión<br />

constante <strong>en</strong> la definición del tamaño del vector.<br />

8.1.4. Difer<strong>en</strong>cias con C<br />

Las constantes se introdujeron <strong>en</strong> las primeras versiones de <strong>C++</strong> mi<strong>en</strong>tras la especificación<br />

del estándar C estaba si<strong>en</strong>do terminada. Aunque el comité a cargo de C<br />

decidió <strong>en</strong>tonces incluir const <strong>en</strong> C, por alguna razón, vino a significar para ellos<br />

«una variable ordinaria que no puede cambiarse». En C, una constante siempre ocupa<br />

espacio de almac<strong>en</strong>ami<strong>en</strong>to y su ámbito es global. El compilador C no puede<br />

tratar const como una constante <strong>en</strong> tiempo de compilación. En C, si escribe:<br />

const int bufsize = 100;<br />

char buf[bufsize];<br />

aparecerá un error, aunque parezca algo razonable. bufsize está guardado <strong>en</strong><br />

algún sitio y el compilador no conoce su valor <strong>en</strong> tiempo de compilación. Opcionalm<strong>en</strong>te<br />

puede escribir:<br />

const int bufsize;<br />

<strong>en</strong> C, pero no <strong>en</strong> <strong>C++</strong>, y el compilador C lo acepta como una declaración que<br />

indica que se almac<strong>en</strong>ará <strong>en</strong> alguna parte. Como C utiliza <strong>en</strong>lace externo para las<br />

constantes, esa semántica ti<strong>en</strong>e s<strong>en</strong>tido. <strong>C++</strong> utiliza normalm<strong>en</strong>te <strong>en</strong>lace interno, así<br />

que, si quiere hacer lo mismo <strong>en</strong> <strong>C++</strong>, debe indicar expresam<strong>en</strong>te que se use <strong>en</strong>lace<br />

externo usando extern.<br />

226<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!