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 105 — #143<br />

✐<br />

3.7. Los operadores y su uso<br />

static_cast<br />

const_cast<br />

reinterpret_cast<br />

dynamic_cast<br />

Para moldes que se comportan bi<strong>en</strong> o<br />

razonablem<strong>en</strong>te bi<strong>en</strong>, incluy<strong>en</strong>do cosas<br />

que se podrían hacer sin un molde<br />

(como una conversión automática de<br />

tipo).<br />

Para moldear const y/o volatile<br />

Para moldear a un significado<br />

completam<strong>en</strong>te difer<strong>en</strong>te. La clave es<br />

que se necesitará volver a moldear al<br />

tipo original para poderlo usar con<br />

seguridad. El tipo al que moldee se<br />

usa típicam<strong>en</strong>te sólo para jugar un<br />

poco o algún otro propósito<br />

misterioso. Éste es el más peligroso<br />

de todos los moldes.<br />

Para realizar un downcasting seguro<br />

(este molde se describe <strong>en</strong> el Capítulo<br />

15).<br />

Cuadro 3.2: Moldes explícitos de <strong>C++</strong><br />

más <strong>en</strong> el Capítulo 15.<br />

static_cast<br />

El static_cast se utiliza para todas las conversiones que están bi<strong>en</strong> definidas.<br />

Esto incluye conversiones «seguras» que el compilador permitiría sin utilizar<br />

un molde, y conversiones m<strong>en</strong>os seguras que están sin embargo bi<strong>en</strong> definidas. Los<br />

tipos de conversiones que cubre static_cast incluy<strong>en</strong> las conversiones típicas sin<br />

molde, conversiones de estrechami<strong>en</strong>to (pérdida de información), forzar una conversión<br />

de un void*, conversiones de tipo implícitas, y navegación estática de jerarquías<br />

de clases (ya que no se han visto aún clases ni her<strong>en</strong>cias, este último apartado se<br />

pospone hasta el Capítulo 15):<br />

//: C03:static_cast.cpp<br />

void func(int) {}<br />

int main() {<br />

int i = 0x7fff; // Max pos value = 32767<br />

long l;<br />

float f;<br />

// (1) Typical castless conversions:<br />

l = i;<br />

f = i;<br />

// Also works:<br />

l = static_cast(i);<br />

f = static_cast(i);<br />

// (2) Narrowing conversions:<br />

i = l; // May lose digits<br />

i = f; // May lose info<br />

// Says "I know," eliminates warnings:<br />

i = static_cast(l);<br />

i = static_cast(f);<br />

char c = static_cast(i);<br />

105<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!