C++四种显式类型转换操作符用途明确:static_cast用于编译期安全转换,dynamic_cast用于多态类型运行时安全向下转型,const_cast仅修改cv限定符,reinterpret_cast按位重解释、最危险。

C++ 有四种显式强制类型转换操作符:static_cast、dynamic_cast、const_cast 和 reinterpret_cast。它们各自用途明确,不能混用,核心区别在于检查时机(编译期 vs 运行期)、适用场景和安全性。
static_cast:最常用,编译期检查,用于“合理且已知安全”的转换
它适用于编译器能静态验证的类型转换,不进行运行时类型检查,效率高,但不保证逻辑正确性——程序员需确保转换语义合法。
- 基本类型间转换(如 int → double、double → int)
- 有明确定义的类类型转换(如通过构造函数或类型转换运算符)
- 向上转型(派生类指针/引用 → 基类指针/引用),安全且推荐
- 向下转型(基类指针 → 派生类指针)——仅当程序员100% 确定对象实际类型时才可用,否则行为未定义
示例:
class Base {}; class Derived : public Base {};
Derived d;
Base& b = d;
Derived& dr = static_cast
立即学习“C++免费学习笔记(深入)”;
dynamic_cast:专用于多态类型,运行期检查,安全但有开销
只能用于含有至少一个虚函数的类(即多态类型),主要用于安全的向下转型和交叉转型。它在运行时检查对象真实类型,失败时返回 nullptr(指针)或抛出 std::bad_cast(引用)。
- 只适用于指针或引用类型
- 基类必须有虚函数(否则编译报错)
- 向下转型失败时,指针转为 nullptr,可直接判空;引用失败则抛异常
- 支持跨继承体系的交叉转型(如多重继承中不同基类间的转换)
示例:
Base* pb = new Derived;
Derived* pd = dynamic_cast
Base* pb2 = new Base;
Derived* pd2 = dynamic_cast
const_cast:唯一能修改 cv 属性的操作符,慎用
仅用于添加或移除 const 或 volatile 限定符,其他任何转换都会编译失败。常用于调用“本不该修改但接口没加 const”的旧 C 函数,或实现 const 与非 const 成员函数的复用。
- 不能改变底层数据的 const 性质(比如对真正 const 对象去 const 后修改,是未定义行为)
- 典型用法:const 成员函数中调用非 const 版本(通过 this 转换)
示例:
const int ci = 42;
int* pi = const_cast
reinterpret_cast:最低级、最危险,按位重解释,几乎不用
它告诉编译器“把这块内存当成另一种类型看待”,不进行任何类型检查或值调整。常见于底层系统编程(如驱动、序列化、指针与整数互转),但极易引发未定义行为。
- 指针 ↔ 整数(如 uintptr_t)
- 不同类型的指针之间互转(如 char* ↔ int*)
- 函数指针类型转换(需谨慎,ABI 相关)
- 绝不应用于替代 static_cast 或 dynamic_cast
示例:
int x = 0x12345678;
char* p = reinterpret_cast
基本上就这些。选哪个 cast,关键看你要做什么:要安全向下转型?用 dynamic_cast;确认类型没问题且追求效率?用 static_cast;改 const?只用 const_cast;真要按位重解释?才考虑 reinterpret_cast —— 并且务必三思。










