operador static_cast
Convierte expresión al tipo de tipo-identificador, basándose únicamente en los tipos que se encuentran en la expresión.
static_cast <type-id> ( expression )
Comentarios
No se crea ninguna comprobación de tipo en tiempo de ejecución para ayudar a garantizar la seguridad de conversión.
El operador de static_cast se puede utilizar para operaciones como convertir un puntero a una clase base a un puntero a una clase derivada.Estas conversiones no siempre son seguras.
En general se utilizan static_cast cuando desea convertir datos numéricos como enumeraciones a los valores de tipo int o valores de tipo int a floats, y está seguro de los tipos de datos implicados en la conversión.las conversiones destatic_cast no es tan segura como las conversiones de dynamic_cast , porque static_cast no realiza ninguna comprobación de tipo en tiempo de ejecución, mientras que hace dynamic_cast .dynamic_cast a un puntero ambiguo producirá un error, mientras static_cast vuelve como si nada fuera incorrecto; esto puede ser peligroso.Aunque las conversiones de dynamic_cast son más seguras, dynamic_cast sólo funciona en punteros o referencias, y la comprobación de tipo en tiempo de ejecución es una sobrecarga.Para obtener más información, vea operador dynamic_cast.
En el ejemplo siguiente, la línea D* pd2 = static_cast<D*>(pb); no es seguro porque D puede tener los campos y métodos que no están en B.Sin embargo, la línea B* pb2 = static_cast<B*>(pd); es una conversión segura porque D siempre contiene todo el B.
// static_cast_Operator.cpp
// compile with: /LD
class B {};
class D : public B {};
void f(B* pb, D* pd) {
D* pd2 = static_cast<D*>(pb); // Not safe, D can have fields
// and methods that are not in B.
B* pb2 = static_cast<B*>(pd); // Safe conversion, D always
// contains all of B.
}
A diferencia de dynamic_cast, no se crea ninguna comprobación en tiempo de ejecución en la conversión de static_cast de pb.El objeto indicada por pb no puede ser un objeto de Descrito, en cuyo caso el uso de *pd2 podría ser desastroso.Por ejemplo, llamando a una función que es miembro de la clase de D , pero no en la clase de B , podría producir una infracción de acceso.
los operadores de dynamic_cast y de static_cast mueven un puntero en una jerarquía de clases.Sin embargo, static_cast confirma exclusivamente en la información proporcionada en la instrucción de la conversión y puede ser por consiguiente seguro.Por ejemplo:
// static_cast_Operator_2.cpp
// compile with: /LD /GR
class B {
public:
virtual void Test(){}
};
class D : public B {};
void f(B* pb) {
D* pd1 = dynamic_cast<D*>(pb);
D* pd2 = static_cast<D*>(pb);
}
Si de pb puntos realmente un objeto de Dy, a continuación pd1 y pd2 obtiene el mismo valor.También son el mismo valor si pb == 0.
Si los puntos de pb a un objeto de B escrito y no a la clase completa de D , entonces dynamic_cast conocen suficientes para devolver cero.Sin embargo, static_cast se basa en la aserción del programador que pb señala a un objeto de D escrito y simplemente devuelve un puntero a dicho objeto supuesto de D .
Por consiguiente, static_cast puede hacer lo contrario de conversiones implícitas, en cuyo caso los resultados son indefinidos.Se permite al programador para comprobar que los resultados de una conversión de static_cast son seguros.
Este comportamiento también se aplica a los tipos distintos de tipos de clase.Por ejemplo, static_cast se puede utilizar para convertir int a char.Sin embargo, char resultante puede no tener suficientes bits para contener el valor completo de int .Una vez más se permite al programador para comprobar que losresultados de una conversión destatic_cast son seguros.
El operador de static_cast también se puede utilizar para realizar cualquier conversión implícita, como las conversiones estándar y conversiones definidas por el usuario.Por ejemplo:
// static_cast_Operator_3.cpp
// compile with: /LD /GR
typedef unsigned char BYTE;
void f() {
char ch;
int i = 65;
float f = 2.5;
double dbl;
ch = static_cast<char>(i); // int to char
dbl = static_cast<double>(f); // float to double
i = static_cast<BYTE>(ch);
}
El operador de static_cast puede convertir explícitamente un valor entero a un tipo de enumeración.Si el valor de tipo entero no pertenece al intervalo de valores de enumeración, el valor de enumeración resultante no está definido.
El operador de static_cast convierte un valor de puntero null al valor del puntero NULL del tipo de destino.
Cualquier expresión se puede convertir explícitamente para escribir vacío por el operador de static_cast .El tipo void de destino puede incluir opcionalmente const, volatile, o el atributo de __unaligned .
El operador de static_cast no puede convertir fuera const, volatile, o los atributos de __unaligned .Vea operador const_cast para obtener información sobre cómo quitar estos atributos.
Debido al riesgo de realizar las conversiones no comprobadas encima de un recolector de elementos no utilizados de reubicación, el uso de static_cast sólo debe estar en código rendimiento-crítico cuando esté seguro de que funciona correctamente.Si debe utilizar static_cast en modo de lanzamiento, sustituyalo con safe_cast en las compilaciones de depuración para proteger correctamente.