Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 372 — #410<br />
✐<br />
Capítulo 12. Sobrecarga de operadores<br />
};<br />
// Overloaded eat():<br />
void eat(Orange);<br />
void eat(Pear);<br />
int main() {<br />
Apple c;<br />
//! eat(c);<br />
// Error: Apple -> Orange or Apple -> Pear <br />
} ///:~<br />
La clase Apple ti<strong>en</strong>e conversiones automáticas a Orange y a Pear. El elem<strong>en</strong>to<br />
capcioso aquí es que no hay problema hasta que algui<strong>en</strong> inoc<strong>en</strong>tem<strong>en</strong>te crea dos<br />
versiones sobrecargadas de eat(). (Con una única versión el codigo <strong>en</strong> main()<br />
funciona correctam<strong>en</strong>te).<br />
De nuevo la solución -- y el lema g<strong>en</strong>eral de la conversión automática de tipos --<br />
es proporcionar solo una conversión automática de un tipo a otro. Puede t<strong>en</strong>er conversiones<br />
a otros tipos, sólo que no deberían ser automáticas. Puede crear llamadas a<br />
funciones explícitas con nombres como makeA() y makeB().<br />
Actividades ocultas<br />
La conversión automática de tipos puede producir mas actividad subyac<strong>en</strong>te de<br />
la que se podría esperar. Mire esta modificación de CopyingVsInitialization.<br />
cpp como un pequeño rompecabezas:<br />
//: C12:CopyingVsInitialization2.cpp<br />
class Fi {};<br />
class Fee {<br />
public:<br />
Fee(int) {}<br />
Fee(const Fi&) {}<br />
};<br />
class Fo {<br />
int i;<br />
public:<br />
Fo(int x = 0) : i(x) {}<br />
operator Fee() const { return Fee(i); }<br />
};<br />
int main() {<br />
Fo fo;<br />
Fee fee = fo;<br />
} ///:~<br />
No hay un constructor para crear Fee fee de un objeto Fo. Sin embargo, F-<br />
o ti<strong>en</strong>e una conversión automática de tipos a Fee. No hay un constructor de copia<br />
para crear un Fee a partir de un Fee, pero ésa es una de las funciones especiales que<br />
el compilador puede crear. (El constructor por defecto, el constructor de copia y o-<br />
perator=) y el destructor pued<strong>en</strong> sintetizarse automáticam<strong>en</strong>te por el compilador.<br />
372<br />
✐<br />
✐<br />
✐<br />
✐