本篇主要介绍C++ 中的类型转换。

类型转换分为隐式与显式两种情况,隐式指较小的数据类型转为较大的数据类型,编译器会自动进行操作,例如 int 转换为 long;显式则与隐式相反,因为可能造成数据丢失等情况因此必须在代码中写明才有效,所以也被称为强制类型转换。

char c = 'a';
int i = (int)c; // C 风格
int i = int(c); // C++ 风格

静态类型转换

目标类型 变量名 = static_cast<目标类型>(源类型变量);

在源类型和目标类型之间只要有一个方向可以做隐式类型转换,那么在两个方向上都可以使用静态类型转换,反之如果在两个方向上都不能做隐式类型转换,那么在两个方向上都不能做静态类型转换。

int* pi;
void* pv = pi;//pi -> pv 隐式类型转换
pi = pv; // void* -> int* 编译报错
pi = static_cast<int*>(pv);

常量类型转换

目标类型 变量名 = const_cast<目标类型>(源类型变量);

主要用于去除指针/引用上面的常属性。

重解释类型转换

目标类型 变量名 = reinterpret_cast<目标类型>(源变量);

主要用于任意指针类型之间的转换,以及指针和整型之间的转换。

动态类型转换

int n/*4个字节->2个short->4个char*/ = dynamic_cast<目标类型>(源类型变量);

主要用于具有多态特性的父子类指针/引用之间的转换。