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

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

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

Saved successfully!

Ooh no, something went wrong!