2012-05-03 10 views
13

¿Cuáles son las diferencias entreEn C++, ¿cuáles son las diferencias entre static_cast <double> (a) y double (a)?

int a; 
// a gets some value 
double pi = static_cast<double>(a)/3; 

y

int a; 
// a gets some value 
double pi = double(a)/3; 

¿Alguna vez ha visto este último? Me parece que lo vi en un fragmento escrito por Stroustrup pero no puedo encontrar la referencia.

+6

Cuando 'a' es un' int', 'static_cast (a)', '(double) a', y' double (a) 'son semánticamente idénticos. Las diferencias se hacen evidentes cuando 'a' es algún otro tipo no escalar, o es' const' o 'volátil', etc. – ildjarn

+0

@ildjarn y desde el punto de vista del rendimiento? –

+1

Idéntico significa idéntico - no hay diferencia alguna. – ildjarn

Respuesta

10

Alguien puede haber pensado que estaban construyendo en lugar de fundición. Considere:

some_fun(std::string("Hello")); 

Muchas personas piensan que están llamando a un constructor allí cuando de hecho están haciendo un lanzamiento de estilo C. Da la casualidad de que el casting mirará a los constructores del tipo de destino entre la larga lista de otras cosas que observa y, por lo tanto, aquí finalmente termina invocando al constructor.

notación funcional yesos tienen todas las mismas debilidades de la otra clase de C reparto:

  • Puede inadvertidamente desechado constness
  • silencio puede convertir en una reinterpretar fundido
  • son difíciles de diferenciar con grepping herramientas.

Además de todo eso, está realizando exactamente la misma operación en ambos casos.

1

usando static_cast es una forma segura de estilo C++, pero (doble) - forma insegura de estilo C antiguo.

ver aquí: Type Casting

7

Este último se conoce como la notación funcional de conversión explícita en el que dice explícitamente a deben ser tratados como un double. Puedes usar cualquier tipo de técnica usando esta técnica.

El primero es la manera preferida para emitir un tipo en C++. Realiza comprobaciones básicas para ver que el tipo al que va a transmitir tiene sentido (puntero de clase secundaria a un puntero de clase base, etc.). Además, como en el ejemplo que muestra, puede realizar conversiones implícitas. Técnicamente, el static_cast en su ejemplo es explícito, pero el resultado de la operación (la asignación) es implícito.

3

No hay diferencia en términos de código de ensamblaje generado entre static_cast<double> (a) y (double) a. La principal ventaja de la notación de cast, (type_id) cast_expression, es que es más flexible. En una situación, podría ser el equivalente de const_cast, en otro, un static_cast, en otro más, un dynamic_cast, en otro más, una combinación de const_cast y static_cast (o dynamic_cast).

Esta fuerza es también una debilidad. La notación de Cast significa diferentes cosas en diferentes lugares. Otra desventaja es que es muy fácil encontrar xxx_cast<type_id> (cast_expression). Solo busque _cast. Es muy difícil encontrar expresiones que usan notación de conversión.

Cuestiones relacionadas