Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 236 — #274<br />
✐<br />
Capítulo 8. Constantes<br />
el creador de una función, pasar una dirección es siempre más efici<strong>en</strong>te que pasar<br />
un objeto completo, y si pasa por refer<strong>en</strong>cia constante significa que la función no<br />
podrá cambiar lo almac<strong>en</strong>ado <strong>en</strong> esa dirección, así que el efecto desde el punto de<br />
vista del programador cli<strong>en</strong>te es lo mismo que el paso por valor (sin embargo es más<br />
efici<strong>en</strong>te).<br />
A causa de la sintaxis de las refer<strong>en</strong>cias (para el cli<strong>en</strong>te es igual que el paso por<br />
valor) es posible pasar un objeto temporario a una función que toma una refer<strong>en</strong>cia<br />
constante, mi<strong>en</strong>tras que nunca puede pasarse un objeto temporario a una función<br />
que toma un puntero (con un puntero, la dirección debe darse explícitam<strong>en</strong>te). Así<br />
que con el paso por refer<strong>en</strong>cia se produce una nueva situación que nunca ocurre <strong>en</strong><br />
C: un temporario, que es siempre constante, puede pasar su dirección a una función<br />
(una función puede tomar por argum<strong>en</strong>to la dirección de un temporario). Esto es<br />
así porque, para permitir que los temporarios se pas<strong>en</strong> por refer<strong>en</strong>cia, el argum<strong>en</strong>to<br />
debe ser una refer<strong>en</strong>cia constante. El sigui<strong>en</strong>te ejemplo lo demuestra:<br />
//: C08:ConstTemporary.cpp<br />
// Temporaries are const<br />
class X {};<br />
X f() { return X(); } // Return by value<br />
void g1(X&) {} // Pass by non-const refer<strong>en</strong>ce<br />
void g2(const X&) {} // Pass by const refer<strong>en</strong>ce<br />
int main() {<br />
// Error: const temporary created by f():<br />
//! g1(f());<br />
// OK: g2 takes a const refer<strong>en</strong>ce:<br />
g2(f());<br />
} ///:~<br />
f() retorna un objeto de la clase X por valor. Esto significa que cuando tome el<br />
valor de retorno y lo pase inmediatam<strong>en</strong>te a otra función como <strong>en</strong> las llamadas a<br />
g1() y g2(), se crea un temporario y los temporarios son siempre constantes. Por<br />
eso, la llamada a g1() es un error pues g1() no acepta una refer<strong>en</strong>cia constante,<br />
mi<strong>en</strong>tras que la llamada a g2() sí es correcta.<br />
8.4. Clases<br />
Esta sección muestra la forma <strong>en</strong> la que se puede usar el especificador const con<br />
las clases. Puede ser interesante crear una constante local a una clase para usarla <strong>en</strong><br />
expresiones constantes que serán evaluadas <strong>en</strong> tiempo de compilación. Sin embargo,<br />
el significado del especificador const es difer<strong>en</strong>te para las clases 4 , de modo que<br />
debe compr<strong>en</strong>der las opciones adecuadas para crear miembros constantes <strong>en</strong> una<br />
clase.<br />
También se puede hacer que un objeto completo sea constante (y como se ha visto,<br />
el compilador siempre hace constantes los objetos temporarios). Pero preservar la<br />
consist<strong>en</strong>cia de un objeto constante es más complicado. El compilador puede asegurar<br />
la consist<strong>en</strong>cia de las variables de los tipos del l<strong>en</strong>guaje pero no puede vigilar la<br />
4 N. del T.: Esto se conoce como polisemia del l<strong>en</strong>guaje<br />
236<br />
✐<br />
✐<br />
✐<br />
✐