2009-10-22 25 views

Respuesta

161

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

también, C++ moldes de estilo se pueden buscar fácilmente, mientras que es muy difícil la búsqueda de estilo c yesos

Otra gran ventaja es que el ++ 4 de estilo diferente C los moldes expresan la intención del programador más claramente.

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

+46

Las únicas conversiones que pueden fallar durante el tiempo de ejecución son 'dynamic_cast's. –

+8

C++ reinterpret_cast (U) puede fallar en el tiempo de ejecución más o menos de la misma forma en que los moldes de estilo C pueden, y son todos bastante diferentes de como falla dynamic_cast (U). –

+11

˗1 normal C fundido '(int) algo' no puede fallar: o bien se obtiene el lanzamiento a int o al error del compilador. –

2

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?

12

Ver A comparison of the C++ casting operators.

Sin embargo, usar la misma sintaxis para una variedad de operaciones de fundición diferentes 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 de 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.

129

En resumen:

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

Más Explicación:

El vaciado estático 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 lugar a un tipo de datos de puntero de 4 bytes a 1 byte de memoria asignada, escrito a este puntero, o bien provocar un error en tiempo de ejecución o se sobreponen a una cierta memoria adyacente.

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

En contraste con la conversión de estilo C, el vaciado estático le permitirá al compilador para comprobar que los tipos de datos de puntero y pointee son compatibles, lo que permite al programador para coger esta asignación de puntero incorrecto durante la compilación.

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

También puede consultar esta página en una explicación más detallada en C++ proyecta: Click Here

+9

Creo que en lugar de "puntero de 4 bytes" significa "puntero al tipo de datos de 4 bytes" – iheanyi

10
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! 
} 
+3

¿Podría elaborar más su respuesta agregando un poco más de descripción acerca de la solución que proporciona? – abarisone

+0

Creo que la respuesta muestra que "static_casts" comprueba conversiones de tipo para asegurarse de que se encuentran en rutas válidas en el gráfico de jerarquía. En este ejemplo particular, se permite la conversión de A * a B * o B * a A * porque A y B forman una ruta en el gráfico jerárquico. C * no está en la ruta, por lo que static_cast producirá un error en tiempo de compilación. Nota: Puede valer la pena señalar que la conversión de A * a B * puede dar como resultado NULL con un dynamic_cast en tiempo de ejecución según el objeto subyacente verdadero. –

2

static_cast los controles en tiempo de compilación que la conversión no es, obviamente, entre los tipos incompatibles. Contrariamente a dynamic_cast, no se verifica la compatibilidad de los tipos en el tiempo de ejecución. Además, la conversión 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 flotar 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.

1

Un gran post explicando diferentes moldes en C/C++, y qué conversión de estilo C realmente tiene: https://anteru.net/blog/2007/12/18/200/index.html

C-Estilo de fundición, utilizando el (tipo de) la sintaxis variable. El peor de todos inventado. Este trata de hacer las siguientes difusiones, en este orden: (ver también C++ estándar, 5,4 expr.cast el párrafo 5)

  1. const_cast
  2. static_cast
  3. static_cast seguido por const_cast
  4. reinterpret_cast
  5. reinterpret_castfollowed por const_cast
Cuestiones relacionadas