reinterpret_cast - static_cast c++ definition




¿Cuál es la diferencia entre static_cast<> y el estilo C? (5)

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?

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


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.


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.


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!
}




static-cast