2011-07-28 13 views
38

Duplicar posible:
When should static_cast, dynamic_cast and reinterpret_cast be used?¿Cuál es la diferencia entre static_cast y reinterpret_cast?

estoy usando la función C en C++, donde una estructura que se pasa como un argumento de tipo void en C se almacena directamente ese mismo tipo de estructura.

por ejemplo, en C.

void getdata(void *data){ 
    Testitem *ti=data;//Testitem is of struct type. 
} 

a hacer lo mismo en C++ i uso static_cast:

void foo::getdata(void *data){ 
    Testitem *ti = static_cast<Testitem*>(data); 
} 

y cuando uso reinterpret_cast lo hace el mismo trabajo, fundición de la struct

cuando uso Testitem *it=(Testitem *)data;

esto hace lo mismo también. Pero, ¿cómo se ve afectada la estructura al usar los tres?

+0

ese hilo dice sobre cuándo usarlo. Estoy preguntando qué es lo que diferencia a esa estructura cuando uso estas tres cosas, y me olvidé de la transmisión dinámica también. Sencillamente, quiero saber cómo se ve afectada la estructura. – HariHaraSudhan

+0

La estructura no se ve afectada (a menos que se realice un fundido entre tipos numéricos). –

Respuesta

90

A static_cast es un elenco de un tipo a otro que (intuitivamente) es un elenco que podría en algunas circunstancias tener éxito y ser significativo en ausencia de un elenco peligroso. Por ejemplo, puede static_cast un void* a un int*, ya que el void* podría en realidad apuntan a una int*, o un int a un char, ya que tal conversión es significativa. Sin embargo, no puede static_cast un int* a un double*, ya que esta conversión solo tiene sentido si el int* ha sido mutilado de alguna manera para apuntar a un double*.

A reinterpret_cast es un molde que representa una conversión insegura que podría reinterpretar los bits de un valor como los bits de otro valor. Por ejemplo, enviar un int* a un double* es legal con un reinterpret_cast, aunque el resultado no está especificado. Del mismo modo, enviar un int a un void* es perfectamente legal con reinterpret_cast, aunque no es seguro.

Ni static_cast ni reinterpret_cast pueden eliminar const de algo. No puede convertir const int* en int* usando ninguno de estos moldes. Para esto, usaría un const_cast.

Un molde de estilo C del formulario (T) se define como intentar hacer un static_cast si es posible, recurriendo a un reinterpret_cast si eso no funciona. También aplicará un const_cast si es absolutamente necesario.

En general, siempre debe preferir static_cast para los moldes que deberían ser seguros. Si accidentalmente intentas hacer un reparto que no está bien definido, entonces el compilador informará un error. Solo use reinterpret_cast si lo que está haciendo realmente está cambiando la interpretación de algunos bits en la máquina, y solo use un molde de estilo C si está dispuesto a arriesgarse haciendo un reinterpret_cast. Para su caso, debe usar el static_cast, ya que el downcast del void* está bien definido en algunas circunstancias.

Cuestiones relacionadas