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