Conversión de tipos de datos en C++
La conversión de tipo forzada estilo C? (Type?Cast) es muy simple, no importa qué tipo de conversión, siempre es:
TYPE?b?=?(TYPE)a
La conversión de tipos de estilo C++ proporciona 4 operadores de conversión de tipos para hacer frente a aplicaciones en diferentes situaciones.
const_cast, literalmente significa eliminar atributos constantes.
static_cast, la denominación se entiende como conversión de tipo estático. Como convertir int a char.
dynamic_cast, la denominación se entiende como conversión de tipo dinámico. Como la conversión de tipo polimórfico entre subclase y clase principal.
reinterpreter_cast solo reinterpreta el tipo, pero no realiza conversión binaria.
Cuatro tipos de formatos de conversión de tipos, como:
TYPE?B?=?static_cast(TYPE)(a)
const_cast
Eliminar los atributos constantes o volátiles del tipo.
struct?SA?{
int?i;
};
const?SA?ra;
//ra.i?=?10;?//Modificar el tipo constante directamente, error de compilación
SA?&rb?=?const_castSA&>(ra);
rb . i?=?10;
static_cast
Similar al reparto estilo C. Conversión incondicional, conversión de tipo estático. Se utiliza para:
1.? Conversión entre clase base y subclase: es seguro convertir un puntero de subclase en un puntero de clase principal, pero no es seguro convertir un puntero de clase principal en un puntero de subclase. (Se recomienda Dynamic_cast para la conversión de tipos dinámicos entre clases base y subclases)
2. enumeración,?estructura,?int,?char,?float, etc. static_cast no puede convertir entre punteros de tipos no relacionados (como clases y subclases no base).
3. Convierta el puntero nulo en un puntero nulo del tipo de destino.
4. Convierta cualquier tipo de expresión en tipo vacío.
5. Static_cast no puede eliminar los atributos constantes y volátiles del tipo (use const_cast).
int?n?=?6;
double?d?=?static_castdouble>(n);?//?Conversión de tipo básico
int? *pn?=?&n;
double?*d?=?static_castdouble?*>(&n)?//Conversión de puntero de tipo irrelevante, error de compilación
void?*p? =?static_castvoid?*>(pn);?//Convierte cualquier tipo a tipo anulado
dynamic_cast
Conversión condicional, conversión de tipo dinámica, verificación de seguridad de tipo en tiempo de ejecución (la conversión falló Devuelve NULL ):
1.? Conversión segura entre clases base y subclases.
2. Debe haber una función virtual.
3.? Conversión cruzada entre diferentes subclases de una misma clase base. Pero el resultado es NULO.
clase?BaseClass?{
público:
int?m_iNum;
virtual?void?foo(){};
//La clase base debe tener funciones virtuales.
Dynamic_cast solo se puede utilizar si se mantienen varias funciones
};
class?DerivedClass:?public?BaseClass?{
public:
char ?*m_szName[100];
void?bar(){};
};
BaseClass*?pb?=?new? DerivedClass() ;
DerivedClass?*pd1?=?static_castDerivedClass?*>(pb);
//Subclass->Clase principal, conversión de tipo estático, correcta pero no recomendada< /p >
DerivedClass?*pd2?=?dynamic_castDerivedClass?*>(pb);
//Subclase->Clase principal, conversión de tipo dinámico, correcta
BaseClass* ? pb2?=?new?BaseClass();
DerivedClass?*pd21?=?static_castDerivedClass?*>(pb2);
//Clase principal->Subclase, tipo estático ¡Cambia, peligro! El acceso al miembro de la subclase m_szName está fuera de los límites
DerivedClass?*pd22?=?dynamic_castDerivedClass?*>(pb2);
//Clase principal->Subclase, conversión de tipo dinámico, segura . El resultado es NULL
reinterpreter_cast
Solo reinterpreta el tipo, pero no realiza conversión binaria:
1. ¿El tipo convertido debe ser un puntero, referencia? , Tipo aritmético, puntero de función o puntero de miembro.
2.?Convertir a nivel de bits. Puede convertir un puntero en un número entero, o un número entero en un puntero (primero convierta un puntero en un número entero y luego convierta el número entero en un puntero del tipo original, y también puede obtener el valor del puntero original). Sin embargo, las instancias que no sean de 32 bits no se pueden convertir en punteros.
3. El uso más común es convertir entre tipos de punteros de función.
4. Es difícil garantizar la portabilidad.
int?doSomething(){return?0;};
typedef?void(*FuncPtr)();
//FuncPtr?is?a Puntero a una función. La función no tiene parámetros y el tipo de valor de retorno es?void
FuncPtr?funcPtrArray[10];
//¿Una matriz de 10 punteros FuncPtrs? Supongamos que espero (por algunas razones inexplicables) almacenar un puntero a la siguiente función en la matriz funcPtrArray:
funcPtrArray[0]?=?&doSomething;
//? ¡Error de compilación! Los tipos no coinciden, reinterpret_cast permite que el compilador los trate a su manera: funcPtrArray
funcPtrArray[0]?=?reinterpret_castFuncPtr>(&doSomething);
//Diferentes punteros de función Convertir entre tipos
Resumen
Utilice const_cast para eliminar atributos constantes.
Utilice static_cast para la conversión de tipos básicos.
Utilice Dynamic_cast para la conversión de tipos entre clases polimórficas.
Utilice reinterpreter_cast para la conversión de tipos de puntero de diferentes tipos.