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