在 C++ 中,`static_cast` 是一种类型转换操作符,用于在不同类型之间进行显式转换,同时提供编译时类型检查。这使得 `static_cast` 比 C 风格的强制类型转换(如 `(int)x`)更安全、更可控。
1 基本语法
static_cast<目标类型>(表达式)
- 目标类型:你想要转换到的类型。
- 表达式:需要被转换类型的表达式。
2 示例用法
2.1 基本数据类型转换
double d = 9.5;
int i = static_cast<int>(d); // 将 double 转换为 int
2.2 类类型转换
假设有两个类 `Base` 和 `Derived`(`Derived` 继承自 `Base`),`static_cast` 可以用于向上转型(子类到基类):
Derived derivedObj;
Base *basePtr = static_cast<Base*>(&derivedObj); // 子类到基类的指针转换
同样也可以用于向下转型(基类到子类),但需谨慎使用,因为向下转型可能不安全:
Base baseObj;
Derived *derivedPtr = static_cast<Derived*>(&baseObj); // 基类到子类的指针转换
2.3 void 指针与其他类型指针之间的转换
int a = 10;
void *p = static_cast<void*>(&a); // 将 int* 转换为 void*
int *ip = static_cast<int*>(p); // 将 void* 转换回 int*
3 使用注意事项
- `static_cast` 不能用于转换没有明显关联的类型,如将一个整数转换为一个类类型的对象。
- 在类层次结构中,`static_cast` 可以用于安全的向上转型(子类指针或引用转换为基类指针或引用)。但是,当用于向下转型时(基类转换为子类),应当确保这种转换是安全的,否则可能导致不正确的行为。
- `static_cast` 不能用于去除 `const`、`volatile` 或 `__unaligned` 属性。对于这些操作,应该使用 `const_cast`。
总的来说,`static_cast` 是 C++ 中一种较为安全的类型转换方式,可以用于基本类型之间的转换,以及与继承相关的安全转换。然而,使用时应当小心,确保转换的安全性和合理性。