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 369 — #407<br />
✐<br />
12.6. Conversión automática de tipos<br />
Number(int ii = 0) : i(ii) {}<br />
const Number<br />
operator+(const Number& n) const {<br />
return Number(i + n.i);<br />
}<br />
fri<strong>en</strong>d const Number<br />
operator-(const Number&, const Number&);<br />
};<br />
const Number<br />
operator-(const Number& n1,<br />
const Number& n2) {<br />
return Number(n1.i - n2.i);<br />
}<br />
int main() {<br />
Number a(47), b(11);<br />
a + b; // OK<br />
a + 1; // 2nd arg converted to Number<br />
//! 1 + a; // Wrong! 1st arg not of type Number<br />
a - b; // OK<br />
a - 1; // 2nd arg converted to Number<br />
1 - a; // 1st arg converted to Number<br />
} ///:~<br />
La clase Number ti<strong>en</strong>e tanto un miembro operator+ como un fri<strong>en</strong>d operator-.<br />
Dado que hay un constructor que acepta un argum<strong>en</strong>to int simple, se puede<br />
convertir un int automáticam<strong>en</strong>te a Number, pero sólo bajo las condiciones adecuadas.<br />
En main(), puede ver que sumar un Number a otro Number funciona bi<strong>en</strong><br />
dado que ti<strong>en</strong>e una correspond<strong>en</strong>cia exacta con el operador sobrecargado. Además,<br />
cuando el compilador ve un Number seguido de un + y de un int, puede hacer la<br />
correspond<strong>en</strong>cia al método Number::operator+ y convertir el argum<strong>en</strong>to int an<br />
Number usando el constructor. Pero cuando ve un int, un + y un Number, no sabe<br />
qué hacer porque todo lo que ti<strong>en</strong>e es Number::operator+ que requiere que el<br />
operando de la izquierda sea ya un objeto Number. Así que, el compilador g<strong>en</strong>era<br />
un error.<br />
Con fri<strong>en</strong>d operator- las cosas son difer<strong>en</strong>tes. El compilador necesita rell<strong>en</strong>ar<br />
ambos argum<strong>en</strong>tos como quiera; no está restringido a t<strong>en</strong>er un Number como<br />
argum<strong>en</strong>to de la parte izquierda. así que si ve:<br />
1 - a<br />
puede convertir el primer argum<strong>en</strong>to a Number usando el constructor.<br />
A veces querrá ser capaz de restringir el uso de sus operadores haciéndolos métodos.<br />
Por ejemplo, cuando multiplique una matriz por un vector, el vector debe ir<br />
a la derecha. Pero si quiere que sus operadores sean capaces de convertir cualquier<br />
argum<strong>en</strong>to, haga el operador una función fri<strong>en</strong>d.<br />
Afortunadam<strong>en</strong>te, el compilador cogerá la expresión 1-1 y convertirá ambos argum<strong>en</strong>tos<br />
a objetos Number y después llamará a operator-. Eso significaría que<br />
el código C exist<strong>en</strong>te podría empezar a funcionar de forma difer<strong>en</strong>te. El compilador<br />
int<strong>en</strong>ta primero la correspond<strong>en</strong>cia «más simple», es decir, <strong>en</strong> este caso el operador<br />
incorporado para la expresión 1-1.<br />
369<br />
✐<br />
✐<br />
✐<br />
✐