c++ 指针强制类型转换
时间: 2024-12-28 20:23:30 浏览: 0
### C++ 中指针的强制类型转换
#### static_cast 的使用
`static_cast<>()` 运算符可以在相关类型之间进行安全的转换,例如从一种指针类型转换为另一种指针类型。这种转换被很好地定义了,并且是可移植和可逆的。编译器会对每一个 `static_cast` 执行一些基本的类型检查[^1]。
```cpp
int main() {
void* pVoid;
int i = 42;
double d = 3.14;
// 将 int 类型指针转换为空指针
pVoid = static_cast<void*>(&i);
// 将空指针转换回 int 类型指针并解引用读取原始值
int j = *static_cast<int*>(pVoid);
// 浮点数到整数的安全转换
int k = static_cast<int>(d);
return 0;
}
```
#### dynamic_cast 的应用
对于涉及继承层次结构中的多态对象之间的转换,则应使用 `dynamic_cast<>()`。此操作符会在运行时执行严格的类型验证;当尝试将基类指针或引用来转成派生类版本而失败时,它会返回 null 或者引发异常。为了使此类转换生效,在基类里应当声明至少一个虚函数[^3]。
```cpp
class Base { virtual ~Base() {} };
class Derived : public Base {};
void example(Base& b) {
try {
// 安全地把 base reference 转换成 derived type
Derived &derivedRef = dynamic_cast<Derived&>(b);
// 如果成功则继续...
} catch (const std::bad_cast&) {
// 处理错误情况
}
}
```
#### const_cast 和 reinterpret_cast 的介绍
除了上述两种方式外还有两个重要的转换工具——`const_cast` 可以移除变量上的常量属性,而 `reinterpret_cast` 则提供了最低级别的重新解释位模式的能力,通常只应在非常特殊的情况下才考虑使用它们[^2]。
```cpp
// 使用 const_cast 移除 const 属性
const char c = 'A';
char mutableChar = const_cast<char&>(c);
// 使用 reinterpret_cast 对不同类型间做低级重映射
uintptr_t rawAddress = reinterpret_cast<uintptr_t>(&mutableChar);
```
阅读全文