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 确保成功。

请参见

参考

转换运算符

C++关键字