c++类型转换

       在传统的C类型转换时是以(type)expression型式进行转换,这种转换缺少对转换的两种类型之间的信息检测。因此在c++中引入了 static_cast, const_cast, dynamic_cast, 和 reinterpret_cast四种类型转换操作符。
  1. static_cast
    在功能上基本上与C风格的类型转换一样强大,是静态类型转换,但没有运行时类型检查来保证转换的安全性。
    • 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
    • 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
    • 把空指针转换成目标类型的空指针。
    • 把任何类型的表达式转换成void类型。

    static_cast不能转换掉const、volitale、或者__unaligned属性。
  2. const_cast
    该运算符用来修改类型的const或volatile属性。const_cast 用于类型转换掉表达式的const或volatileness属性。通过使用const_cast,你向人们和编译器强调你通过类型转换想做的只是改变一些东西的constness或者 volatileness属性。这个含义被编译器所约束。如果你试图使用const_cast来完成修改constness 或者volatileness属性之外的事情,你的类型转换将被拒绝。
  3. dynamic_cast
    被用于安全地沿着类的继承关系向下进行类型转换。这就是说,你能用dynamic_cast把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常(当对引用进行类型转换时)。它不能被用于缺乏虚函数的类型上。
  4. reinterpret_cast
    这个操作符被用于的类型转换的转换结果几乎都是实现时定义(implementation-defined)。因此,使用reinterpret_casts的代码很难移植。einterpret_casts用于对变量重新进行二进制解释,因此它的转型结果是编译器实现相关(implementation-dependent)的,不是可移植的,一般在实践 中,只有迫不得已,才使用这种转型。例如直接将整数常量转型为某个自定义的struct类型,驱动程序的编写中常常使用这种技术。
    IO_device * d1 = reinterpret_cast<IO_device *>(0x ff00); // device at 0xff00
     总之,我们要尽量使用C++风格的类型转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值