C++强制类型转换
1. static_cast
用途:
- 用于编译时已知类型关系的转换(编译器可验证)。
- 常用于基本类型转换(如
int
→double
)、父子类指针/引用转换(无多态)、void*
与其他指针类型的转换。
示例:
double d = 3.14;
int i = static_cast<int>(d); // 基本类型转换
class Base {};
class Derived : public Base {};
Base* base_ptr = new Derived;
Derived* derived_ptr = static_cast<Derived*>(base_ptr); // 向下转换(不安全!需开发者确保类型正确)
特点:
- 无运行时检查,错误转换可能导致未定义行为(如错误的向下转换)。
- 不能移除
const
(用const_cast
)。
2. dynamic_cast
用途:
- 用于多态类型(含虚函数的类)的安全向下转换(基类 → 派生类)。
- 运行时检查类型是否合法,失败返回
nullptr
(指针)或抛出异常(引用)。
示例:
class Base { virtual void foo() {} }; // 必须含虚函数
class Derived : public Base {};
Base* base_ptr = new Derived;
Derived* derived_ptr = dynamic_cast<Derived*>(base_ptr); // 安全向下转换
if (derived_ptr != nullptr) {
// 转换成功
}
特点:
- 需要运行时类型信息(RTTI),性能略低。
- 只能用于含虚函数的类(多态类型)。
3. const_cast
用途:
- 移除或添加
const
/volatile
限定符。 - 常用于兼容旧代码的接口(如传递
const
对象到非const
参数)。
示例:
const int x = 10;
int* y = const_cast<int*>(&x); // 移除 const(但修改 x 的值是未定义行为!)
void legacy_func(char* str);
const char* str = "hello";
legacy_func(const_cast<char*>(str)); // 兼容旧接口
警告:
- 修改原为
const
的对象是未定义行为(可能导致崩溃)。 - 仅用于语法层面的
const
移除,不可滥用。
4. reinterpret_cast
用途:
- 低层位模式重新解释(不改变二进制值,仅改变类型解释)。
- 用于指针与整数、不同类型指针/引用间的转换(如
int*
→char*
)。
示例:
int x = 0x12345678;
char* ptr = reinterpret_cast<char*>(&x); // 将 int* 转为 char*(用于逐字节操作)
uintptr_t addr = reinterpret_cast<uintptr_t>(ptr); // 指针转整数(实现依赖)
警告:
- 高度依赖平台和编译器,不可移植。
- 极易引发未定义行为(如类型不对齐)。
对比 C 风格转换
C 风格转换(如 (int)3.14
)会尝试按以下顺序应用:
const_cast
static_cast
(可包含void*
转换)static_cast
+const_cast
reinterpret_cast
reinterpret_cast
+const_cast
缺点:
- 掩盖具体转换意图,易隐藏错误。
- 无法精确控制转换行为。
总结
转换类型 | 典型用途 | 安全性 |
---|---|---|
static_cast | 明确类型关系的转换(编译时检查) | 较高(开发者需确保正确性) |
dynamic_cast | 多态类型的安全向下转换(运行时检查) | 高 |
const_cast | 移除/添加 const 或 volatile | 低(慎用) |
reinterpret_cast | 低层二进制重新解释(平台相关) | 极低(危险) |
原则:
- 优先使用
static_cast
和dynamic_cast
。 - 避免使用
const_cast
和reinterpret_cast
,除非必须且明确后果。