static_cast 运算符

将转换表达式为的类型类型的 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在调试版本中,以确保成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值