Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO Pensar en C++ (Volumen 1) - Grupo ARCO

arco.esi.uclm.es
from arco.esi.uclm.es More from this publisher
13.01.2015 Views

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 366 — #404 ✐ Capítulo 12. Sobrecarga de operadores Cargo& operator=(const Cargo&) { cout

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 367 — #405 ✐ 12.6. Conversión automática de tipos int main() { One one; f(one); // Wants a Two, has a One } ///:~ Cuando el compilador ve que f() es invocada pasando un objeto One, mira en la declaración de f() y ve que requiere un Two. Entonces busca si hay alguna manera de conseguir un Two a partir de un One, encuentra el constructor Two::Two(One) y lo llama. Pasa el objeto Two resultante a f(). En este caso, la conversión automática de tipos le ha salvado del problema de definir dos versiones sobrecargadas de f(). Sin embargo el coste es la llamada oculta al constructor de Two, que puede ser importante si está preocupado por la eficiencia de las llamadas a f(), Evitar la conversión por constructor Hay veces en que la conversión automática de tipos vía constructor puede ocasionar problemas. Para desactivarlo, modifique el constructor anteponiéndole la palabra reservada explicit (que sólo funciona con constructores). Así se ha hecho para modificar el constructor de la clase Two en el ejemplo anterior: //: C12:ExplicitKeyword.cpp // Using the "explicit" keyword class One { public: One() {} }; class Two { public: explicit Two(const One&) {} }; void f(Two) {} int main() { One one; //! f(one); // No auto conversion allowed f(Two(one)); // OK -- user performs conversion } ///:~ Haciendo el constructor de Two explícito, se le dice al compilador que no realice ninguna conversión automática de tipos usando ese constructor en particular (sí se podrían usar otros constructores no explícitos de esa clase para realizar conversiones automáticas). Si el usuario quiere que ocurra esa conversión, debe escribir el codigo necesario. En el código de arriba, f(Two(one)) crea un objeto temporal de tipo T- wo a partir de one, justo como el compilador hizo automáticamente en la versión anterior. 367 ✐ ✐ ✐ ✐

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 366 — #404<br />

✐<br />

Capítulo 12. Sobrecarga de operadores<br />

Cargo& operator=(const Cargo&) {<br />

cout

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

Saved successfully!

Ooh no, something went wrong!