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 233 — #271<br />
✐<br />
8.3. Argum<strong>en</strong>tos de funciones y valores de retorno<br />
//! f7(f6());<br />
} ///:~<br />
f5() devuelve un objeto de clase X no constante, mi<strong>en</strong>tras que f6() devuelve<br />
un objeto de clase X pero constante. Solo el valor de retorno por valor no constante<br />
se puede usar como recipi<strong>en</strong>te.<br />
Por eso, es importante usar const cuando se devuelve un objeto por valor si<br />
quiere impedir que se use como recipi<strong>en</strong>te.<br />
La razón por la que const no ti<strong>en</strong>e s<strong>en</strong>tido cuando se usa para devolver por<br />
valor variables de tipos del l<strong>en</strong>guaje es que el compilador impide automáticam<strong>en</strong>te<br />
el uso de dichos tipos como recipi<strong>en</strong>te, ya que devuelve un valor, no una variable.<br />
Solo cuando se devuelv<strong>en</strong> objetos por valor de tipos definidos por el programador<br />
esta funcionalidad toma s<strong>en</strong>tido.<br />
La función f7() toma como argum<strong>en</strong>to una refer<strong>en</strong>cia no constante (la refer<strong>en</strong>cia<br />
es una forma adicional para manejar direcciones <strong>en</strong> <strong>C++</strong> y se trata <strong>en</strong> el [FIX-<br />
ME:XREF:capitulo 11]). Es parecido a tomar un puntero no constante, aunque la sintaxis<br />
es difer<strong>en</strong>te. La razón por la que no compila es por la creación de un temporario.<br />
Temporarios<br />
A veces, durante la evaluación de una expresión, el compilador debe crear objetos<br />
temporales (temporarios). Son objetos como cualquier otro: requier<strong>en</strong> espacio de<br />
almac<strong>en</strong>ami<strong>en</strong>to y se deb<strong>en</strong> construir y destruir. La difer<strong>en</strong>cia es que nunca se v<strong>en</strong>,<br />
el compilador es el responsable de decidir si se necesitan y los detalles de su exist<strong>en</strong>cia.<br />
Una particularidad importante de los temporarios es que siempre son constantes.<br />
Como normalm<strong>en</strong>te no manejará objetos temporarios, hacer algo que cambie<br />
un temporario es casi seguro un error porque no será capaz de usar esa información.<br />
Para evitar esto, el compilador crea todos los temporarios como objetos constantes,<br />
de modo que le avisará si int<strong>en</strong>ta modificarlos.<br />
En el ejemplo anterior, f5() devuelve un objeto no constante. Pero <strong>en</strong> la expresión:<br />
f7(f5());<br />
el compilador debe crear un temporario para albergar el valor de retorno de f-<br />
5() para que pueda ser pasado a f7(). Esto funcionaría bi<strong>en</strong> si f7() tomara su<br />
argum<strong>en</strong>to por valor; <strong>en</strong>tonces el temporario se copiaría <strong>en</strong> f7() y no importaría lo<br />
que se pase al temporario X.<br />
Sin embargo, f7() toma su argum<strong>en</strong>to por refer<strong>en</strong>cia, lo que significa que toma<br />
la dirección del temporario X. Como f7() no toma su argum<strong>en</strong>to por refer<strong>en</strong>cia<br />
constante, ti<strong>en</strong>e permiso para modificar el objeto temporario. Pero el compilador sabe<br />
que el temporario desaparecerá <strong>en</strong> cuanto se complete la evaluación de la expresión,<br />
y por eso cualquier modificación hecha <strong>en</strong> el temporario se perderá. Haci<strong>en</strong>do<br />
que los objetos temporarios sean constantes automáticam<strong>en</strong>te, la situación causa un<br />
error de compilación de modo que evitará cometer un error muy difícil de localizar.<br />
En cualquier caso, t<strong>en</strong>ga pres<strong>en</strong>te que las expresiones sigui<strong>en</strong>tes son correctas:<br />
f5() = X(1);<br />
f5().modify();<br />
233<br />
✐<br />
✐<br />
✐<br />
✐