static_cast用于编译期安全的常规转换,如内置类型转换、向上转型和自定义类型转换;dynamic_cast专用于多态类型的运行时安全向下转型;const_cast仅移除顶层const/volatile;reinterpret_cast是底层按位重解释,风险最高。

static_cast 适用于编译期可判定的常规转换
当你明确知道两个类型之间存在合法、安全的语义关系,且不需要运行时检查时,static_cast 是首选。它覆盖了绝大多数日常场景:内置类型间升/降级(如 double → int)、类层次中向上转型(Derived* → Base*)、带转换构造函数或 operator T() 的自定义类型转换。
常见错误现象:static_cast 允许向下转型(Base* → Derived*),但若实际对象并非 Derived 类型,结果是未定义行为——它不校验,只信任你。
- 算术转换中,
static_cast<int>(3.9)</int>得到3,截断而非四舍五入 - 不能移除
const,写static_cast<int>(const_int_ref)</int>会编译失败 - 不能把
int*转成char*(无继承/相关性),必须用reinterpret_cast
dynamic_cast 仅用于多态类型的运行时安全向下转型
dynamic_cast 唯一不可替代的用途是:在有虚函数的类体系中,将基类指针或引用安全地转为派生类类型,并在失败时返回 nullptr(指针)或抛出 std::bad_cast(引用)。它依赖 RTTI,因此开销比 static_cast 大,且只对多态类型有效。
使用场景非常具体:你拿到一个 Base*,不确定它是否指向 Derived,又不能修改接口加 is_derived() 这类方法。
- 对非多态类型(无虚函数)使用
dynamic_cast会编译报错 - 转换失败时,指针版本返回
nullptr,引用版本抛异常——必须处理这两种分支 - 不要用它做数值转换,比如
dynamic_cast<double>(42)</double>是非法的
const_cast 只用来临时绕过 const 限定,且仅限于解除“顶层 const”
const_cast 的作用极其狭窄:仅用于添加或移除对象的 const 或 volatile 限定符,且只能用于原本就不是 const 的对象。它不改变类型本质,也不做任何值转换。
典型误用:对字面量或真正 const 对象(如 const int x = 5;)解 const 后修改,触发未定义行为——编译器可能把它优化进寄存器,改了也看不到。
- 正确用法:
const_cast<char>(str.c_str())</char>,当你要把std::string::c_str()的const char*传给一个老 C API,该 API 声明为void f(char*)但实际不修改内容 - 错误用法:
const_cast<int>(some_const_int) = 10;</int>—— 除非你能 100% 确保some_const_int是从非常量变量来的 - 不能用它把
int*变成double*,那是reinterpret_cast的事
reinterpret_cast 是最后手段,等价于按位重解释内存
reinterpret_cast 不进行任何逻辑转换,只是把同一块内存按目标类型重新读取。它绕过所有类型系统约束,风险最高,应仅在底层系统编程、序列化、与硬件/ABI 交互等极少数场景下使用。
性能上它零开销,但兼容性和可移植性最差。不同平台对指针/整数宽度、对齐、字节序的处理差异,会让 reinterpret_cast 行为不可预测。
- 常见合法用例:把对象地址转成
uintptr_t做哈希或调试打印;把char*缓冲区 reinterpret 成结构体指针(需确认对齐和填充) - 危险用例:
reinterpret_cast<int>(0x12345678)</int>—— 地址合法性、权限、是否映射都由你全权负责 - 绝不能用它替代
static_cast做数值转换,比如reinterpret_cast<int>(3.14)</int>得到的是 double 的二进制位模式解释为 int,不是 3
选错 cast 最容易被忽略的一点:不是“能不能编译过”,而是“语义是否匹配”。static_cast 看似万能,但它对向下转型的放任,常让问题延迟到运行时崩溃;而 reinterpret_cast 写起来最短,却最容易在换平台或升级编译器后失效。真正的判断依据永远是——你想表达什么意图,而不是你想让代码跑起来。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











