static_cast reinterpret_cast implicito ejemplo dynamic_cast dev c++ casting static-cast

c++ - reinterpret_cast - ¿Cuál es la diferencia entre static_cast<> y el estilo C?



static_cast c++ (7)

¿Hay alguna razón para preferir static_cast<> sobre el estilo C? ¿Son equivalentes? ¿Hay algún tipo de diferencia de velocidad?


Dado que hay muchos tipos diferentes de conversión, cada uno con semántica diferente, static_cast <> le permite decir "Estoy haciendo una conversión legal de un tipo a otro", como de int a doble. Un elenco estilo C simple puede significar muchas cosas. ¿Estás arriba / abajo del casting? ¿Estás reinterpretando un puntero?


Los modelos de C ++ son controlados por el compilador. Los moldes de estilo C no son y pueden fallar en el tiempo de ejecución

también, los moldes de estilo c ++ se pueden buscar fácilmente, mientras que es muy difícil buscar moldes de estilo c

Otro gran beneficio es que los 4 moldes de estilo C ++ diferentes expresan la intención del programador más claramente.

Al escribir C ++, casi siempre usaría los C ++ sobre el estilo C.


Una gran publicación que explica diferentes moldes en C / C ++, y lo que realmente hace el molde de estilo C: https://anteru.net/blog/2007/12/18/200/index.html

Fundición C-Style, usando la sintaxis de la variable (tipo). Lo peor que se haya inventado. Esto trata de hacer los siguientes moldes, en este orden: (ver también C ++ Standard, 5.4 expr.cast paragraph 5)

  1. const_cast
  2. static_cast
  3. static_cast seguido de const_cast
  4. reinterpretar_cast
  5. reinterpret_cast seguido de const_cast

Ver una comparación de los operadores de colada de C ++ .

Sin embargo, usar la misma sintaxis para una variedad de diferentes operaciones de conversión puede hacer que la intención del programador no sea clara.

Además, puede ser difícil encontrar un tipo específico de elenco en una gran base de código.

la generalidad del elenco estilo C puede ser excesiva para situaciones en las que todo lo que se necesita es una conversión simple. La capacidad de seleccionar entre varios operadores de fundición diferentes con diferentes grados de potencia puede evitar que los programadores emitan inadvertidamente un tipo incorrecto.


static_cast comprueba en tiempo de compilación que la conversión no está entre tipos obviamente incompatibles. Contrariamente a dynamic_cast , no se verifica la compatibilidad de los tipos en el tiempo de ejecución. Además, la conversión de static_cast no es necesariamente segura.

static_cast se usa para convertir de puntero a clase base a puntero a clase derivada, o entre tipos nativos, como enum a int o float a int.

El usuario de static_cast debe asegurarse de que la conversión sea segura.

La conversión de estilo C no realiza ninguna comprobación, ya sea en compilación o en tiempo de ejecución.


En resumen :

  1. static_cast<>() le da una capacidad de comprobación de tiempo de compilación, el molde C-Style no.
  2. static_cast<>() es más legible y se puede detectar fácilmente en cualquier lugar dentro de un código fuente de C ++, C_Style cast is''nt.
  3. Las intenciones se transmiten mucho mejor usando moldes de C ++.

Más Explicación :

La conversión estática realiza conversiones entre tipos compatibles . Es similar al lanzamiento de estilo C, pero es más restrictivo. Por ejemplo, el elenco estilo C permitiría un puntero entero apuntar a un char.

char c = 10; // 1 byte int *p = (int*)&c; // 4 bytes

Dado que esto da como resultado un puntero de 4 bytes (un puntero al tipo de datos de 4 bytes) que apunta a 1 byte de memoria asignada, escribir en este puntero provocará un error de tiempo de ejecución o sobrescribirá la memoria adyacente.

*p = 5; // run-time error: stack corruption

A diferencia del elenco de estilo C, el elenco estático le permitirá al compilador verificar que los tipos de datos de puntero y de punta son compatibles, lo que permite al programador detectar esta asignación de puntero incorrecta durante la compilación.

int *q = static_cast<int*>(&c); // compile-time error

También puede consultar esta página para obtener más información sobre los moldes de C ++: haga clic aquí


struct A {}; struct B : A {}; struct C {}; int main() { A* a = new A; int i = 10; a = (A*) (&i); // NO ERROR! FAIL! //a = static_cast<A*>(&i); ERROR! SMART! A* b = new B; B* b2 = static_cast<B*>(b); // NO ERROR! SMART! C* c = (C*)(b); // NO ERROR! FAIL! //C* c = static_cast<C*>(b); ERROR! SMART! }