static_cast<type>
是 C++ 中的一种类型转换方式,用于在编译期进行静态类型转换。与 C 风格的强制类型转换不同,static_cast
更加安全和明确,因为它只允许特定的类型转换,避免了潜在的错误和歧义。
static_cast
的用法
static_cast<type>(expression)
将 expression
转换为 type
类型。常见的使用场景包括:
-
基本类型转换:用于将不同的基本数据类型相互转换,例如
int
转换为float
或double
。int i = 10; float f = static_cast<float>(i); // int 转换为 float
-
指针和引用的上行转换(upcasting):在继承体系中,
static_cast
可以安全地将派生类指针或引用转换为基类指针或引用。class Base {}; class Derived : public Base {}; Derived d; Base* b = static_cast<Base*>(&d); // Derived* 转换为 Base*
-
显式转换回原始类型:可以用来将枚举、
void*
等非相关类型转换为基本类型(前提是类型是兼容的)。void* ptr = &i; int* intPtr = static_cast<int*>(ptr); // 将 void* 转换回 int*
-
避免隐式转换不当发生:有时构造函数或重载运算符可能引发隐式类型转换,用
static_cast
可以使转换更清晰、避免歧义。
static_cast
的限制
- 不能用于转换不相关的指针类型。
- 不检查转换的类型安全性。比如,将基类指针强制转换为派生类指针时需要确保类型正确,否则会导致未定义行为。
示例
#include <iostream>
class Base {};
class Derived : public Base {};
int main() {
int num = 10;
double d = static_cast<double>(num); // int 转换为 double
Derived derived;
Base* base = static_cast<Base*>(&derived); // Derived* 转换为 Base*
std::cout << d << std::endl; // 输出 10.0
return 0;
}
总结
static_cast
是一种类型安全的显式转换工具,适合编译期可确定的转换需求。