# C++四种类型转换
面试官问:"C++ 的四种类型转换有什么区别?什么时候用哪个?"
这题考的是你对类型安全的理解。很多人能列出四个名字,但说不清它们的安全性差异、底层机制区别,以及为什么 C++ 要搞四种而不是像 C 那样一个 (type) 搞定。
# 简要回答
C++ 用四种命名转换替代 C 风格的 (type)value,目的是让转换意图显式化,编译器能帮你检查错误:
static_cast:编译时转换,用途最广,不做运行时检查dynamic_cast:运行时转换,专用于继承体系的安全向下转换,失败返回nullptrconst_cast:功能单一,只改const/volatile属性reinterpret_cast:最危险,比特位重解释,不做任何检查
# 详细回答
为什么不用 C 风格转换?
C 风格 (type)value 就像一把瑞士军刀——功能多但分不清在干什么。它可能执行上述四种中的任何一种,程序员和编译器都无法从代码中看出意图。C++ 的四种转换是四把专用工具,意图明确,出了问题容易定位。
static_cast
用途最广泛,编译时完成,零运行时开销。能做的事:基础类型转换(int → double)、void* 转具体指针、继承体系中的向上转换(安全)和向下转换(不安全,不检查)。
向下转换时它假设你知道自己在干什么——如果转错了,直接未定义行为。
dynamic_cast
专门用于有虚函数的继承体系,做安全的向下转换。它在运行时通过 RTTI 检查对象的实际类型:指针转换失败返回 nullptr,引用转换失败抛 std::bad_cast。代价是有运行时开销。
什么时候用:你拿到一个基类指针,不确定它实际指向哪个派生类,需要安全地试探。
const_cast
功能极其单一:加或去 const/volatile。合法用途是去掉"底层 const"——比如一个非 const 变量被 const 指针指着,你确定不会改它,但要传给一个参数非 const 的旧 API。
注意:对本身就是 const 声明的变量去 const 再修改,是未定义行为。
reinterpret_cast
最底层、最危险。纯粹把一块内存的比特位当另一种类型来读,不做任何转换计算。用于指针和整数互转、不相关指针类型互转等场景。99% 的应用开发用不到,只有驱动、序列化、内存管理等底层场景才需要。

# 知识拓展
面试官可能追问:
Q1: static_cast 和 dynamic_cast 向下转换有什么区别?
static_cast 编译期完成,不检查,转错了就是未定义行为(访问错误内存、崩溃)。dynamic_cast 运行期通过 RTTI 检查,转错了返回 nullptr 或抛异常,你可以处理错误。代价是 dynamic_cast 有性能开销。
Q2: const_cast 去掉 const 后修改值,什么时候安全什么时候不安全?
变量本身不是 const,只是被 const 指针/引用指着——去 const 后修改是安全的。变量本身就是 const int x = 42 这样声明的——去 const 后修改是未定义行为,编译器可能把值优化成常量,你改了也没用。
Q3: reinterpret_cast 和 static_cast 处理指针转换有什么本质区别?
static_cast 在多重继承中会调整指针值(因为基类子对象地址可能和派生类对象地址不同)。reinterpret_cast 不调整,纯粹把比特位原样当新类型用,不关心类型关系,不保证结果有效。
评论
验证登录状态...