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