C++四种显式类型转换操作符用途明确:static_cast用于编译期安全转换,dynamic_cast用于多态类型运行时安全向下转型,const_cast仅修改cv限定符,reinterpret_cast按位重解释、最危险。
C++ 有四种显式强制类型转换操作符:static_cast、dynamic_cast、const_cast 和 reinterpret_cast。它们各自用途明确,不能混用,核心区别在于检查时机(编译期 vs 运行期)、适用场景和安全性。
它适用于编译器能静态验证的类型转换,不进行运行时类型检查,效率高,但不保证逻辑正确性——程序员需确保转换语义合法。
示例:
class Base {}; class Derived : public Base {};
Derived d;
Base& b = d;
Derived& dr = static_cast
只能用于含有至少一个虚函数的类(即多态类型),主要用于安全的向下转型和交叉转型。它在运行时检查对象真实类型,失败时返回 nullptr(指针)或抛出 std::bad_cast(引用)。
同基类间的转换)示例:
Base* pb = new Derived;
Derived* pd = dynamic_cast
Base* pb2 = new Base;
Derived* pd2 = dynamic_cast
仅用于添加或移除 const 或 volatile 限定符,其他任何转换都会编译失败。常用于调用“本不该修改但接口没加 const”的旧 C 函数,或实现 const 与非 const 成员函数的复用。
示例:
const int ci = 42;
int* pi = const_cast
它告诉编译器“把这块内存当成另一种类型看待”,不进行任何类型检查或值调整。常见于底层系统编程(如驱动、序列化、指针与整数互转),但极易引发未定义行为。
示例:
int x = 0x12345678;
char* p = reinterpret_cast
基本上就这些。选哪个 cast,关键看你要做什么:要安全向下转型?用 dynamic_cast;确认类型没问题且追求效率?用 static_cast;改 const?只用 const_cast;真要按位重解释?才考虑 reinterpret_cast —— 并且务必三思。