static_cast运算符
转换 表达式 为 类型 ID, 的类型只根据存在表达式的类型。
static_cast <type-id> ( expression )
备注
运行时类型检查不提交帮助确保转换的安全。
static_cast 运算符可用于操作用于例如将指针转换为基类指针为派生类。 此类转换始终是不安全的。
通常使用 static_cast ,如果要将数字数据类型 (如枚举转换为 int 变量或 int 变量转换为浮点数时,因此,您在转换涉及的确保数据类型。 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的字段和方法。 但是,在中,因为 D 始终包含所有 B,行 B* pb2 = static_cast<B*>(pd); 是一个安全的转换。
// 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不同,运行时检查在 pbstatic_cast 转换不提交。 ,在使用 *pd2 可能是灾难性的情况下, pb 所指向的对象可能不是类型 D对象。 例如,调用是 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 运算符将 null 指针值为目标类型的 null 指针值。
所有表达式可以显式转换为 null 的类型由 static_cast 运算符。 目标无效类型可以选择包含 const、 volatile或 __unaligned 属性。
static_cast 运算符无法转换 const、 volatile或 __unaligned 属性。 有关如何移除这些属性的信息,请参见 const_cast 运算符 。
由于执行无检查转换的危险中定位的垃圾回收器的顶部,使用 static_cast 只应在性能关键代码,在确信时将正常工作。 如果在发布模式必须使用 static_cast ,请替换其与调试版本的 safe_cast 确保成功。