C++类型转换分隐式和显式两类,显式含static_cast(安全常用)、dynamic_cast(多态下行安全)、const_cast(调整cv限定符)和危险的reinterpret_cast。
C++ 中的类型转换分为隐式转换和显式转换两大类,显式转换又细分为四种 命名强制转换(named cast):`static_cast`、`dynamic_cast`、`const_cast` 和 `reinterpret_cast`。其中前三种在日常开发中较常用且相对安全,而 `reinterpret_cast` 风险极高,应尽量避免。
用于有明确逻辑关系的类型间转换,编译期检查,不涉及运行时开销。适合以下场景:
示例:
double d = 3.14;
int i = static_cast(d); // 合理,但截断小数
Base* b = new Derived;
Derived* d_ptr = static_cast(b); // 可行,但若 b 实际不是 Derived 就崩溃
专用于多态类型的指针或引用的下行转换(基类 → 派生类),要求基类至少有一个虚函数(即支持 RTTI)。转换失败时:
这是 最安全的下行转换方式,代价是轻微运行时开销。
示例:
Base* b = new Base;
Derived* d = dynamic_cast(b); // 返回 nullptr,不会崩溃
if (d) { /* 安全使用 */ }
仅用于添加或移除 const 或 volatile 限定符,其他任何改动都会导致未定义行为。
示例:
void legacy_func(char* s);
const std::string s = "hello";
legacy_func(const_cast(s.c_str())); // OK,前提是 legacy_func 不写入
基本上就这些。优先用 `static_cast`,涉及继承体系下行转换时用 `dynamic_cast`,仅当必须调整 const 性时才用 `const_cast`。`reinterpret_cast` 应视为“最后手段”,通常只出现在底层系统编程或与硬件/ABI 交互的场景中。