将转换表达式为的类型类型的 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 是安全的转换。
C++
// 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,在进行任何运行时检查static_cast的转换pb。 由 pb 指向的对象可能不是 D 类型的对象,在这种情况下使用 *pd2 会是灾难性的。 例如,调用 D 类(而非 B 类)的成员函数可能会导致访问冲突。
Dynamic_cast并static_cast运算符移动整个类层次结构的指针。 但是, static_cast专门依赖使用 cast 语句中提供的信息,因此可能不安全。 例如:
C++
// 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运算符还可用于执行任何隐式转换,包括标准转换和用户定义的转换。 例如:
C++
// 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运算符将 null 指针值转换为目标类型的 null 指针值。
任何表达式可以显式转换为类型 void 通过static_cast运算符。 目标 void 类型可以选择性地包含const,易失性,或 __unaligned属性。
Static_cast运算符无法转换掉const,易失性,或者 __unaligned属性。 请参阅const_cast 运算符有关删除这些属性的信息。
C++/ CLI: 由于重定位垃圾回收器,使用顶部执行无检查的转换的危险static_cast仅在性能关键代码时应确定将正常工作。 如果必须使用static_cast在发布模式下,将其与safe_cast在调试版本中,以确保成功。