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