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

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

Saved successfully!

Ooh no, something went wrong!