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 234 — #272<br />

✐<br />

Capítulo 8. Constantes<br />

Aunque son aceptables para el compilador, <strong>en</strong> realidad son problemáticas. f5()<br />

devuelve un objeto de clase X, y para que el compilador pueda satisfacer las expresiones<br />

anteriores debe crear un temporario para albergar el valor de retorno. De modo<br />

que <strong>en</strong> ambas expresiones el objeto temporario se modifica y tan pronto como la<br />

expresión es evaluada el temporario se elimina. Como resultado, las modificaciones<br />

se pierd<strong>en</strong>, así que probablem<strong>en</strong>te este código es erróneo, aunque el compilador no<br />

diga nada al respecto. Las expresiones como éstas son sufici<strong>en</strong>tem<strong>en</strong>te simples como<br />

para detectar el problema, pero cuando las cosas son más complejas los errores son<br />

más difíciles de localizar.<br />

La forma de preservar la constancia de los objetos se muestra más adelante <strong>en</strong><br />

este capítulo.<br />

8.3.3. Paso y retorno de direcciones<br />

Si pasa o retorna una dirección (ya sea un puntero o una refer<strong>en</strong>cia), el programador<br />

cli<strong>en</strong>te puede recoger y modificar el valor al que apunta. Si hace que el puntero<br />

o refer<strong>en</strong>cia sea constante, impedirá que esto suceda, lo que puede ahorrarle problemas.<br />

De hecho, cada vez que se pasa una dirección como parámetro a una función,<br />

debería hacerla constante siempre que sea posible. Si no lo hace, está excluy<strong>en</strong>do la<br />

posibilidad de usar la función con constantes.<br />

La opción de devolver un puntero o refer<strong>en</strong>cia constante dep<strong>en</strong>de de lo que quiera<br />

permitir hacer al programador cli<strong>en</strong>te. Aquí se muestra un ejemplo que demuestra<br />

el uso de punteros constantes como argum<strong>en</strong>tos de funciones y valores de retorno.<br />

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

// Constant pointer arg/return<br />

void t(int*) {}<br />

void u(const int* cip) {<br />

//! *cip = 2; // Illegal -- modifies value<br />

int i = *cip; // OK -- copies value<br />

//! int* ip2 = cip; // Illegal: non-const<br />

}<br />

const char* v() {<br />

// Returns address of static character array:<br />

return "result of function v()";<br />

}<br />

const int* const w() {<br />

static int i;<br />

return &i;<br />

}<br />

int main() {<br />

int x = 0;<br />

int* ip = &x;<br />

const int* cip = &x;<br />

t(ip); // OK<br />

//! t(cip); // Not OK<br />

u(ip); // OK<br />

u(cip); // Also OK<br />

//! char* cp = v(); // Not OK<br />

234<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!