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