Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 333 — #371<br />
✐<br />
12.3. Operadores sobrecargables<br />
Los dos operadores sobrecargados están definidos como métodos <strong>en</strong> línea que<br />
imprim<strong>en</strong> un m<strong>en</strong>saje al ser llamados. El único argum<strong>en</strong>to de estas funciones miembro<br />
será el que aparezca del lado derecho del operador binario. Los operadores unarios<br />
no ti<strong>en</strong><strong>en</strong> argum<strong>en</strong>tos cuando se defin<strong>en</strong> como métodos. El método es invocado<br />
por el objeto de la parte izquierda del operador.<br />
Para los operadores incondicionales (los condicionales g<strong>en</strong>eralm<strong>en</strong>te devuelv<strong>en</strong><br />
un valor booleano), g<strong>en</strong>eralm<strong>en</strong>te se deseará devolver un objeto o una refer<strong>en</strong>cia del<br />
mismo tipo que está operando, si los dos argum<strong>en</strong>tos son del mismo tipo. (Si no son<br />
del mismo tipo, la interpretación de lo que debería pasar es responsabilidad suya).<br />
De esta manera, se pued<strong>en</strong> construir expresiones tan complicadas como la sigui<strong>en</strong>te:<br />
kk += ii + jj;<br />
La expresión operator+ crea un nuevo objeto Integer (un temporario) que<br />
se usa como argum<strong>en</strong>to rv para el operador operator+=. Este objeto temporal se<br />
destruye tan pronto como deja de necesitarse.<br />
12.3. Operadores sobrecargables<br />
Aunque puede sobrecargar casi todos los operadores disponibles <strong>en</strong> C, el uso de<br />
operadores sobrecargados es bastante restrictivo. En particular, no puede combinar<br />
operadores que actualm<strong>en</strong>te no ti<strong>en</strong><strong>en</strong> significado <strong>en</strong> C (como ** para repres<strong>en</strong>tar la<br />
pot<strong>en</strong>cia), no puede cambiar la preced<strong>en</strong>cia de evaluación de operadores, y tampoco<br />
el número de argum<strong>en</strong>tos requeridos por un operador. Estas restricciones exist<strong>en</strong><br />
para prev<strong>en</strong>ir que la creación de nuevos operadores ofusqu<strong>en</strong> el significado <strong>en</strong> lugar<br />
de clarificarlo.<br />
Las sigui<strong>en</strong>tes dos subsecciones muestran ejemplos de todos los operadores normales,<br />
sobrecargados <strong>en</strong> la forma habitual.<br />
12.3.1. Operadores unarios<br />
El sigui<strong>en</strong>te ejemplo muestra la sintaxis para sobrecargar todos los operadores<br />
unarios, <strong>en</strong> ambas formas: como funciones globales (funciones fri<strong>en</strong>d, no métodos)<br />
y como métodos. Estas expandirán la clase Integer vista previam<strong>en</strong>te y añadirá<br />
una nueva clase byte. El significado de sus operadores particulares dep<strong>en</strong>derá de la<br />
forma <strong>en</strong> que los use, pero considere a los programadores del grupo antes de hacer<br />
algo inesperado. He aquí un catálogo de todas las funciones unarias:<br />
//: C12:OverloadingUnaryOperators.cpp<br />
#include <br />
using namespace std;<br />
// Non-member functions:<br />
class Integer {<br />
long i;<br />
Integer* This() { return this; }<br />
public:<br />
Integer(long ll = 0) : i(ll) {}<br />
// No side effects takes const& argum<strong>en</strong>t:<br />
333<br />
✐<br />
✐<br />
✐<br />
✐