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 347 — #385<br />
✐<br />
12.3. Operadores sobrecargables<br />
d<strong>en</strong> tratar el objeto como un const. La versión prefija devuelve el valor del objeto<br />
después de cambiarlo, así que usted espera recuperar el objeto que fue cambiado. De<br />
este modo, con la versión prefija puede simplem<strong>en</strong>te revolver *this como una refer<strong>en</strong>cia.<br />
Se supone que la versión postfija devolverá el valor antes de que sea cambiado,<br />
luego está forzado a crear un objeto separado para repres<strong>en</strong>tar el valor y devolverlo.<br />
Así que con la versión postfija debe devolverlo por valor si quiere mant<strong>en</strong>er el<br />
significado esperado. (Advierta que a veces <strong>en</strong>contrará operadores de increm<strong>en</strong>to y<br />
decrem<strong>en</strong>to que devuelv<strong>en</strong> un int o un bool para indicar, por ejemplo, que un objeto<br />
preparado para moverse a través de una lista está al final de ella). Ahora la pregunta<br />
es: ¿Debería éste devolverse como una refer<strong>en</strong>cia const o no const. Si permite<br />
que el objeto sea modificado y algui<strong>en</strong> escribe (a++).func(), func operará <strong>en</strong><br />
la propia a, pero con (++a).func(), funcopera <strong>en</strong> el objeto temporal devuelto<br />
por el operador postfijo operator++. Los objetos temporales son automáticam<strong>en</strong>te<br />
const, así que esto podría ser rechazado por el compilador, pero <strong>en</strong> favor de la<br />
consist<strong>en</strong>cia t<strong>en</strong>dría más s<strong>en</strong>tido hacerlos ambos const como hemos hecho aquí. O<br />
puede elegir hacer la versión prefija no const y la postfija const. Debido a la variedad<br />
de significados que puede darle a los operadores de increm<strong>en</strong>to y decrem<strong>en</strong>to,<br />
deb<strong>en</strong> considerarse <strong>en</strong> términos del caso individual.<br />
Retorno por valor como constante<br />
El retorno por valor como una constante puede parecer un poco sutil al principio,<br />
así que es digno de un poco más de explicación. Considere el operador binario operator+.<br />
Si lo ve <strong>en</strong> una expresión como f(a+b), el resultado de a+b se convierte <strong>en</strong><br />
un objeto temporal que se usará <strong>en</strong> la llamada a f(). Debido a que es temporal, es<br />
automáticam<strong>en</strong>te const, así que aunque, de forma explicita, haga el valor de retorno<br />
const o no, no t<strong>en</strong>drá efecto.<br />
Sin embargo, también es posible mandar un m<strong>en</strong>saje al valor de retorno de a+b,<br />
mejor que simplem<strong>en</strong>te pasarlo a la función. Por ejemplo, puede decir (a+b).g()<br />
<strong>en</strong> la que g() es algún método de Integer, <strong>en</strong> este caso. Haci<strong>en</strong>do el valor de retorno<br />
const, está indicando que sólo un método const puede ser llamado sobre ese<br />
valor de retorno. Esto es correcto desde el punto de vista del const, porque le evita<br />
almac<strong>en</strong>ar información pot<strong>en</strong>cialm<strong>en</strong>te importante <strong>en</strong> un objeto que probablem<strong>en</strong>te<br />
será destruido.<br />
Optimización del retorno<br />
Advierta la manera que se usa cuando se crean nuevos objetos para ser devueltos<br />
por valor. En operator+, por ejemplo:<br />
return Integer(left.i + right.i);<br />
Esto puede parecer <strong>en</strong> principio como una «función de llamada a un constructor»<br />
pero no lo es. La sintaxis es la de un objeto temporal; la s<strong>en</strong>t<strong>en</strong>cia dice «crea un objeto<br />
Integer temporal y desvuélvelo». A causa de esto, puede p<strong>en</strong>sar que el resultado<br />
es el mismo que crear un objeto local con nombre y devolverlo. Sin embargo, es algo<br />
difer<strong>en</strong>te. Si <strong>en</strong> su lugar escribiera:<br />
Integer tmp(left.i + right.i);<br />
return tmp;<br />
sucederían tres cosas. La primera, se crea el objeto tmp incluy<strong>en</strong>do la llamada a<br />
su constructor. La segunda, el constructor de copia duplica tmp <strong>en</strong> la localización del<br />
347<br />
✐<br />
✐<br />
✐<br />
✐