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 368 — #406<br />

✐<br />

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

12.6.2. Conversión por operador<br />

La segunda forma de producir conversiones automáticas de tipo es a través de<br />

la sobrecarga de operadores. Puede crear un método que tome el tipo actual y lo<br />

convierta al tipo deseado usando la palabra reservada operator seguida del tipo al<br />

que quiere convertir. Esta forma de sobrecarga de operadores es única porque parece<br />

que no se especifica un tipo de retorno -- el tipo de retorno es el nombre del operador<br />

que está sobrecargando. He aquí un ejemplo:<br />

//: C12:OperatorOverloadingConversion.cpp<br />

class Three {<br />

int i;<br />

public:<br />

Three(int ii = 0, int = 0) : i(ii) {}<br />

};<br />

class Four {<br />

int x;<br />

public:<br />

Four(int xx) : x(xx) {}<br />

operator Three() const { return Three(x); }<br />

};<br />

void g(Three) {}<br />

int main() {<br />

Four four(1);<br />

g(four);<br />

g(1); // Calls Three(1,0)<br />

} ///:~<br />

Con la técnica del constructor, la clase destino realiza la conversión, pero con<br />

los operadores, la realiza la clase orig<strong>en</strong>. El valor de la técnica del constructor es que<br />

puede añadir una nueva ruta de conversión a un sistema exist<strong>en</strong>te al crear una nueva<br />

clase. Sin embargo, creando un constructor con un único argum<strong>en</strong>to siempre define<br />

una conversión automática de tipos (incluso si requiere más de un argum<strong>en</strong>to si el<br />

resto de los argum<strong>en</strong>tos ti<strong>en</strong>e un valor por defecto), que puede no ser lo que desea<br />

(<strong>en</strong> cuyo caso puede desactivarlo usando explicit). Además, no hay ninguna forma<br />

de usar una conversión por constructor desde un tipo definido por el usuario a<br />

un tipo incorporado; eso sólo es posible con la sobrecarga de operadores.<br />

Reflexividad<br />

Una de las razones más conv<strong>en</strong>i<strong>en</strong>tes para usar operadores sobrecargados globales<br />

<strong>en</strong> lugar de operadores miembros es que <strong>en</strong> la versión global, la conversión<br />

automática de tipos puede aplicarse a cualquiera de los operandos, mi<strong>en</strong>tras que<br />

con objetos miembro, el operando de la parte izquierda debe ser del tipo apropiado.<br />

Si quiere que ambos operandos sean convertidos, la versión global puede ahorrar un<br />

montón de código. He aquí un pequeño ejemplo:<br />

//: C12:ReflexivityInOverloading.cpp<br />

class Number {<br />

int i;<br />

public:<br />

368<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!