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 231 — #269<br />

✐<br />

8.3. Argum<strong>en</strong>tos de funciones y valores de retorno<br />

8.3.1. Paso por valor constante<br />

Puede indicar que los argum<strong>en</strong>tos de funciones son constantes cuando se pasa<br />

por valor como:<br />

void f1(const int i) {<br />

i++; // ilegal<br />

}<br />

pero, ¿qué significa esto Está impidi<strong>en</strong>do que el valor de la variable original<br />

pueda ser cambiado <strong>en</strong> la función f1(). De todos formas, como el argum<strong>en</strong>to se pasa<br />

por valor, es sabido que inmediatam<strong>en</strong>te se hace una copia de la variable original, así<br />

que dicha restricción se cumple implícitam<strong>en</strong>te sin necesidad de usar el especificador<br />

const.<br />

D<strong>en</strong>tro de la función, const si toma un significado: El argum<strong>en</strong>to no se puede<br />

cambiar. Así que, <strong>en</strong> realidad, es una herrami<strong>en</strong>ta para el programador de la función,<br />

no para el que la usa.<br />

Para evitar la confusión del usuario de la función, puede hacer que el argum<strong>en</strong>to<br />

sea constante d<strong>en</strong>tro de la función <strong>en</strong> lugar de <strong>en</strong> la lista de argum<strong>en</strong>tos. Podría<br />

hacerlo con un puntero, pero la sintaxis más adecuada para lograrlo es la refer<strong>en</strong>cia,<br />

algo que se tratará <strong>en</strong> profundidad <strong>en</strong> el capitulo 11[FIXME:XREF].<br />

Brevem<strong>en</strong>te, una refer<strong>en</strong>cia es como un puntero constante que se derefer<strong>en</strong>cia<br />

automáticam<strong>en</strong>te, así que es como t<strong>en</strong>er un alias de la variable. Para crear una refer<strong>en</strong>cia,<br />

debe usar el símbolo & <strong>en</strong> la definición. De ese modo se ti<strong>en</strong>e una definición<br />

libre de confusiones.<br />

void f2(int ic) {<br />

const int &i = ic;<br />

i++; // ilegal (error de ócompilacin)<br />

}<br />

De nuevo, aparece un m<strong>en</strong>saje de error, pero esta vez el especificador const no<br />

forma parte de la cabecera de la función, solo ti<strong>en</strong>e s<strong>en</strong>tido <strong>en</strong> la implem<strong>en</strong>tación de<br />

la función y por la tanto es invisible para el cli<strong>en</strong>te.<br />

8.3.2. Retorno por valor constante<br />

Algo similar ocurre con los valores de retorno. Si dice que el valor de retorno de<br />

una función es constante:<br />

const int g();<br />

está dici<strong>en</strong>do que el valor de la variable original (<strong>en</strong> el ámbito de la función) no<br />

se modificará. Y de nuevo, como lo está devolvi<strong>en</strong>do por valor, es la copia lo que se<br />

retorna, de modo que el valor original nunca se podrá modificar.<br />

En principio, esto puede hacer suponer que el especificador const ti<strong>en</strong>e poco<br />

significado. Puede ver la apar<strong>en</strong>te falta de s<strong>en</strong>tido de devolver constantes por valor<br />

<strong>en</strong> este ejemplo:<br />

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

231<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!