static_cast 运算符
仅根据表达式中存在的类型,将 expression 转换为 type-id 类型。
语法
static_cast <type-id> ( expression )
备注
在标准 C++ 中,不进行运行时类型检查来帮助确保转换的安全。 在 C++/CX 中,将执行编译时和运行时检查。 有关更多信息,请参见 强制转换中定义的接口的私有 C++ 特定实现。
static_cast
运算符可用于将指向基类的指针转换为指向派生类的指针等操作。 此类转换并非始终安全。
通常使用 static_cast
转换数值数据类型,例如将枚举型转换为整型或将整型转换为浮点型,而且你能确定参与转换的数据类型。 static_cast
转换安全性不如 dynamic_cast
转换,因为 static_cast
不执行运行时类型检查,而 dynamic_cast
执行该检查。 对不明确的指针的 dynamic_cast
将失败,而 static_cast
的返回结果看似没有问题;这是危险的。 尽管 dynamic_cast
转换更加安全,但是 dynamic_cast
只适用于指针或引用,而且运行时类型检查也是一项开销。 有关详细信息,请参阅 dynamic_cast 运算符。
在下面的示例中,因为 D* pd2 = static_cast<D*>(pb);
可能有不在 D
内的字段和方法,所以行 B
不安全。 但是,因为 B* pb2 = static_cast<B*>(pd);
始终包含所有 D
,所以行 B
是安全的转换。
// static_cast_Operator.cpp
// compile with: /LD
class B {};
class D : public B {};
void f(B* pb, D* pd) {
D* pd2 = static_cast<D*>(pb); // Not safe, D can have fields
// and methods that are not in B.
B* pb2 = static_cast<B*>(pd); // Safe conversion, D always
// contains all of B.
}
与 dynamic_cast 不同,pb
的 static_cast
转换不执行运行时检查。 由 pb
指向的对象可能不是 D
类型的对象,在这种情况下使用 *pd2
会是灾难性的。 例如,调用 D
类(而非 B
类)的成员函数可能会导致访问冲突。
dynamic_cast
和 static_cast
运算符可以在整个类层次结构中移动指针。 然而,static_cast
完全依赖于转换语句提供的信息,因此可能不安全。 例如:
// static_cast_Operator_2.cpp
// compile with: /LD /GR
class B {
public:
virtual void Test(){}
};
class D : public B {};
void f(B* pb) {
D* pd1 = dynamic_cast<D*>(pb);
D* pd2 = static_cast<D*>(pb);
}
如果 pb
确实指向 D
类型的对象,则 pd1
和 pd2
将获取相同的值。 如果 pb == 0
,它们也将获取相同的值。
如果 pb
指向 B
类型的对象,而非指向完整的 D
类,则 dynamic_cast
足以判断返回零。 但是,static_cast
依赖于程序员的断言,即 pb
指向 D
类型的对象,因而只是返回指向那个假定的 D
对象的指针。
因此,static_cast
可以反向执行隐式转换,而在这种情况下结果是不确定的。 这需要程序员来验证 static_cast
转换的结果是否安全。
该行为也适用于类以外的类型。 例如,static_cast
可用于将 int 转换为 char
。 但是,得到的 char
可能没有足够的位来保存整个 int
值。 同样,这需要程序员来验证 static_cast
转换的结果是否安全。
static_cast
运算符还可用于执行任何隐式转换,包括标准转换和用户定义的转换。 例如:
// static_cast_Operator_3.cpp
// compile with: /LD /GR
typedef unsigned char BYTE;
void f() {
char ch;
int i = 65;
float f = 2.5;
double dbl;
ch = static_cast<char>(i); // int to char
dbl = static_cast<double>(f); // float to double
i = static_cast<BYTE>(ch);
}
static_cast
运算符可以将整数值显式转换为枚举类型。 如果整型值不在枚举值的范围内,生成的枚举值是不确定的。
static_cast
运算符将空指针值转换为目标类型的空指针值。
任何表达式都可以通过 static_cast
运算符显式转换为 void 类型。 目标 void 类型可以选择性地包含 const
、volatile
或 __unaligned
特性。
static_cast
运算符无法强制转换掉 const
、volatile
或 __unaligned
特性。 有关移除这些特性的详细信息,请参阅 const_cast Operator。
C++/CLI:由于在一个重定位垃圾回收器顶部执行无检查转换存在的危险,你只应在确信代码将正常运行的时候,在性能关键代码中使用 static_cast
。 如果必须在发布模式下使用 static_cast
,请在调试版本中用 safe_cast 替换它以确保成功。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈