C++类型转换
C风格强制类型转换
C语言中强制类型转换的方式为
1 | |
例如
1 | |
C风格的强制类型转换虽然方式简单,可以在任意类型之间转换,但这同时也导致了C风格强制类型转换极其不安全,需要严格的代码审查。
C++风格强制类型转换
因此C++在完全兼容C的基础上,引入了新的强制类型转换。
static_cast
用于基本数据类型之间的转换,例如
float转int,int转char等- 在有类型指针和
void*之间转换使用,但不能使用static_cast在有类型指针之间进行类型转换。 - 子类对象指针转换成父类对象指针也可以使用
static_cast。
非多态类型转换一般都使用static_cast,而且最好把所有的隐式类型转换都用static_cast进行显式替换,但不能使用static_cast在有类型指针之间进行类型转换。
dynamic_cast
一般用于将父类的指针转换为子类的指针,此场景下父类必须要有虚函数,因为dynamic_cast是运行时检查,检查需要有运行时信息RTTI,而RTTI存储在虚函数表中
如果父类没有虚函数,或者转换的双方不是父子关系,dynamic_cast会返回nullptr。
1 | |
const_cast
一般用于常量指针与非常量指针之间的转换,只有const_cast才可以对常量进行操作,一般用它来去除常量性(也能够去除volatile),但去除常量性是危险操作,还是要谨慎使用。
1 | |
reinterpret_cast
类似C语言中的强制类型转换,基本上什么都可以转,有安全风险。如果其他的强制转换无法解决问题,再考虑reinterpret_cast
C++类型转换
https://guts.homes/2025/06/13/cpp-type-conversion/