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

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

Saved successfully!

Ooh no, something went wrong!