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

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

Saved successfully!

Ooh no, something went wrong!