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

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

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

Saved successfully!

Ooh no, something went wrong!