static_cast操作符

static_cast <type-id> ( expression )

@breif:将表达式expression从当前类型转换为type-id所指类型。

@remark:没有运行时的类型检查来保证转换的安全性。static_cast操作符可以被用来一把一个指针变量转换为基类型把一个指针变量转换为派生类型。这样的转换并不总是安全。

总之,你可以使用static_cast当你想当你想把数字类型比如enums、int转换为float,并且你对转换的数据类型有把握。static_cast不像dynamic_cast那么安全,因为static_cast不会运行时类型检查,但dynamic_cast会。一个有歧义的或者模糊不清的dynamic_cast转换会失败,但static_cast面对同样的情况会表现的没有错误发生,这很危险。尽管dynamic_cast转换更安全,dynamic_cast只作用于指针或者引用,毕竟运行时的类型检查是一种开销。

?
// 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, pb may
                                   // point to just B
   B* pb2 = static_cast <B*>(pd);   // safe conversion
}

  与dynamic_cast相比,没有运行时类型检查的转换作用域pb。pb指向的对象可能不是D类型,在有些情况下使用pb2可能是灾难性的。例如,调用一个类B没有但在类D中的函数,会导致访问冲突。dynamic_cast和static_cast将一个指针在类层次上移动。

总结一下static_cast

1.static_cast不进行运行时类型检查,dynamic_cast进行运行时类型检查。

2.static_cast支持隐式转换。

3.使用static_cast转换不会丢失cosnt,volatile或__unaligned属性。

4.使用static_cast请你确认它一定会正确的起效。

5.如果你必须在release模式下用static_cast,请使用safe_cast代替。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值