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

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

Saved successfully!

Ooh no, something went wrong!