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 106 — #144<br />

✐<br />

Capítulo 3. C <strong>en</strong> <strong>C++</strong><br />

// (3) Forcing a conversion from void* :<br />

void* vp = &i;<br />

// Old way produces a dangerous conversion:<br />

float* fp = (float*)vp;<br />

// The new way is equally dangerous:<br />

fp = static_cast(vp);<br />

// (4) Implicit type conversions, normally<br />

// performed by the compiler:<br />

double d = 0.0;<br />

int x = d; // Automatic type conversion<br />

x = static_cast(d); // More explicit<br />

func(d); // Automatic type conversion<br />

func(static_cast(d)); // More explicit<br />

} ///:~<br />

En la sección (FIXME:xref:1), se pued<strong>en</strong> ver tipos de conversiones que eran usuales<br />

<strong>en</strong> C, con o sin un molde. Promover un int a long o float no es un problema porque<br />

el último puede albergar siempre cualquier valor que un int pueda cont<strong>en</strong>er. Aunque<br />

es innecesario, se puede utilizar static_cast para remarcar estas promociones.<br />

Se muestra <strong>en</strong> (2) como se convierte al revés. Aquí, se puede perder información<br />

porque un int no es tan «ancho» como un long o un float; no aloja números<br />

del mismo tamaño. De cualquier modo, este tipo de conversión se llama conversión<br />

de estrechami<strong>en</strong>to. El compilador no impedirá que ocurran, pero normalm<strong>en</strong>te dará<br />

una advert<strong>en</strong>cia. Se puede eliminar esta advert<strong>en</strong>cia e indicar que realm<strong>en</strong>te se<br />

pret<strong>en</strong>día esto utilizando un molde.<br />

Tomar el valor de un void* no está permitido <strong>en</strong> <strong>C++</strong> a m<strong>en</strong>os que use un molde<br />

(al contrario de C), como se puede ver <strong>en</strong> (3). Esto es peligroso y requiere que los<br />

programadores sepan lo que están haci<strong>en</strong>do. El static_cast, al m<strong>en</strong>os, es mas<br />

fácil de localizar que los moldes antiguos cuando se trata de cazar fallos.<br />

La sección (FIXME:xref:4) del programa muestra las conversiones de tipo implícitas<br />

que normalm<strong>en</strong>te se realizan de manera automática por el compilador. Son<br />

automáticas y no requier<strong>en</strong> molde, pero el utilizar static_cast ac<strong>en</strong>túa dicha acción<br />

<strong>en</strong> caso de que se quiera reflejar claram<strong>en</strong>te qué está ocurri<strong>en</strong>do, para poder<br />

localizarlo después.<br />

const_cast<br />

Si quiere convertir de un const a un no-const o de un volatile a un no-volatile,<br />

se utiliza const_cast. Es la única conversión permitida con const_cast;<br />

si está involucrada alguna conversión adicional se debe hacer utilizando una<br />

expresión separada o se obt<strong>en</strong>drá un error <strong>en</strong> tiempo de compilación.<br />

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

int main() {<br />

const int i = 0;<br />

int* j = (int*)&i; // Deprecated form<br />

j = const_cast(&i); // Preferred<br />

// Can’t do simultaneous additional casting:<br />

//! long* l = const_cast(&i); // Error<br />

volatile int k = 0;<br />

int* u = const_cast(&k);<br />

106<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!