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 346 — #384<br />

✐<br />

Capítulo 12. Sobrecarga de operadores<br />

sos. (En algunos casos es correcto, pero siempre debería t<strong>en</strong>erlo <strong>en</strong> m<strong>en</strong>te cuando<br />

escriba operator=).<br />

Todos los operadores mostrados <strong>en</strong> los dos ejemplos previos son sobrecargados<br />

para manejar un tipo simple. También es posible sobrecargar operadores para manejar<br />

tipos compuestos, de manera que pueda sumar manzanas a naranjas, por ejemplo.<br />

Antes de que empiece una sobrecarga exhaustiva de operadores, no obstante,<br />

debería mirar la sección de conversión automática de tipos más adelante <strong>en</strong> este capitulo.<br />

A m<strong>en</strong>udo, una conversión de tipos <strong>en</strong> el lugar adecuado puede ahorrarle un<br />

montón de operadores sobrecargados.<br />

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

Puede parecer un poco confuso inicialm<strong>en</strong>te cuando lea los archivos OverloadingUnaryOperators.<br />

cpp, Integer.h y Byte.h y vea todas las maneras difer<strong>en</strong>tes <strong>en</strong> que se pasan y devuelv<strong>en</strong><br />

los argum<strong>en</strong>tos. Aunque usted pueda pasar y devolver argum<strong>en</strong>tos de la<br />

forma que prefiera, las decisiones <strong>en</strong> estos ejemplos no se han realizado al azar. Sigu<strong>en</strong><br />

un patrón lógico, el mismo que querrá usar <strong>en</strong> la mayoría de sus decisiones.<br />

1. Como con cualquier argum<strong>en</strong>to de función, si sólo necesita leer el argum<strong>en</strong>to<br />

y no cambiarlo, lo usual es pasarlo como una refer<strong>en</strong>cia const. Normalm<strong>en</strong>te<br />

operaciones aritméticas (como + y -, etc.) y booleanas no cambiarán sus<br />

argum<strong>en</strong>tos, así que pasarlas como una refer<strong>en</strong>cia const es lo que veré mayoritariam<strong>en</strong>te.<br />

Cuando la función es un método, esto se traduce <strong>en</strong> una método<br />

const. Sólo con los operadores de asignación (como +=) y operator=, que<br />

cambian el argum<strong>en</strong>to de la parte derecha, no es el argum<strong>en</strong>to derecho una<br />

constante, pero todavía se pasa <strong>en</strong> dirección porque será cambiado.<br />

2. El tipo de valor de retorno que debe seleccionar dep<strong>en</strong>de del significado esperado<br />

del operador. (Otra vez, puede hacer cualquier cosa que desee con los<br />

argum<strong>en</strong>tos y con los valores de retorno). Si el efecto del operador es producir<br />

un nuevo valor, necesitará g<strong>en</strong>erar un nuevo objeto como el valor de retorno.<br />

Por ejemplo, Integer::operator+ debe producir un objeto Integer que<br />

es la suma de los operandos. Este objeto se devuelve por valor como una constante<br />

así que el resultado no se puede modificar como un «valor izquierdo».<br />

3. Todas los operadores de asignación modifican el valor izquierdo. Para permitir<br />

que el resultado de la asignación pueda ser usado <strong>en</strong> expresiones <strong>en</strong>cad<strong>en</strong>adas,<br />

como a = b = c, se espera que devuelva una refer<strong>en</strong>cia al mismo valor izquierdo<br />

que acaba de ser modificado. Pero ¿debería ser esta refer<strong>en</strong>cia const<br />

o no const. Aunque lea a = b = c de izquierda a derecha, el compilador la<br />

analiza de derecha a izquierda, así que no está obligado a devolver una refer<strong>en</strong>cia<br />

no const para soportar asignaciones <strong>en</strong>cad<strong>en</strong>adas. Sin embargo, la g<strong>en</strong>te<br />

a veces espera ser capaz de realizar una operación sobre el elem<strong>en</strong>to de acaba<br />

de ser asignado, como (a = b).func(); para llamar a func de a después<br />

de asignarle b. De ese modo, el valor de retorno para todos los operadores de<br />

asignación debería ser una refer<strong>en</strong>cia no const para el valor izquierdo.<br />

4. Para los operadores lógicos, todo el mundo espera obt<strong>en</strong>er <strong>en</strong> el peor de los<br />

casos un tipo int, y <strong>en</strong> el mejor un tipo bool. (Las librerías desarrolladas antes<br />

de que los compiladores de <strong>C++</strong> soportaran el tipo incorporado bool usaban<br />

un tipo int o un typedef equival<strong>en</strong>te).<br />

Los operadores de increm<strong>en</strong>to y decrem<strong>en</strong>to pres<strong>en</strong>tan un dilema a causa de las<br />

versiones postfija y prefija. Ambas versiones cambian el objeto y por tanto no pue-<br />

346<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!