¿Cuál es la diferencia entre static cast<> y C style casting?


¿Hay alguna razón para preferir static_cast<> al estilo C? Son equivalentes? ¿Hay alguna diferencia de velocidad?

Author: Ajay, 2009-10-22

7 answers

Los casts de estilo C++ son comprobados por el compilador. Los casts de estilo C no son y pueden fallar en tiempo de ejecución

Además, los moldes de estilo c++ se pueden buscar fácilmente, mientras que es realmente 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 de C++ sobre el estilo de C.

 175
Author: Glen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-22 18:52:04

En resumen:

  1. static_cast<>() le da una capacidad de comprobación de tiempo de compilación, estilo C el reparto no.
  2. static_cast<>() es más legible y se puede ver fácilmente en cualquier lugar dentro de un código fuente de C++, C_Style cast no lo es.
  3. Las intenciones se transmiten mucho mejor usando C++ casts.

Más Explicación:

El cast estático realiza conversiones entre tipos compatibles. Es similar al elenco estilo C, pero es más restrictivo. Para por ejemplo, el cast de estilo C permitiría que un puntero entero apunte a un char.

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

Dado que esto resulta en un puntero de 4 bytes ( un puntero al tipo de datos de 4 bytes) apuntando a 1 byte de memoria asignada, escribir en este puntero causará un error en tiempo de ejecución o sobrescribirá alguna memoria adyacente.

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

En contraste con el cast de estilo C, el cast estático permitirá al compilador comprobar que los tipos de datos puntero y puntero son compatibles, lo que permite al programador capturar 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 con más explicaciones sobre los moldes de C++: Haga clic aquí

 142
Author: Breeze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-08 19:28:10

Ver Una comparación de los operadores de casting de C++ .

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

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

La generalidad del molde de estilo C puede ser exagerada para situaciones en las que todo lo que se necesita es una simple conversión. La capacidad de seleccionar entre varios casting diferentes los operadores de diferentes grados de potencia pueden evitar que los programadores puedan lanzar inadvertidamente a un tipo incorrecto.

 13
Author: Eugene Yokota,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-22 18:41:36
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!
}
 13
Author: Rishi Khaneja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-16 11:10:26

static_cast comprueba en tiempo de compilación que la conversión no es entre tipos obviamente incompatibles. Al contrario de dynamic_cast, no se comprueba la compatibilidad de tipos en tiempo de ejecución. Además, static_cast la conversión no es necesariamente segura.

static_cast se utiliza 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 es segura.

El elenco de estilo C no realiza ninguna comprobar, ya sea en la compilación o en tiempo de ejecución.

 4
Author: octoback,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-01 08:19:09

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

 3
Author: Doug T.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-22 18:40:48

Un gran post explicando diferentes casts en C / C++, y lo que realmente hace C-style cast: https://anteru.net/blog/2007/12/18/200/index.html

C-Style casting, usando la sintaxis de la variable (type). El peor de todos inventar. Esto intenta hacer los siguientes moldes, en este orden: (ver también estándar de C++, 5.4 expr.cast paragraph 5)

  1. const_cast
  2. static_cast
  3. static_cast seguido de const_cast
  4. reinterpret_cast
  5. reinterpret_castfollowed by const_cast
 2
Author: Ying Xiong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-15 19:23:58