C++中static_cast, dynamic_cast, const_cast, reinterpret_cast

前言

 题目中这些都是C++类型的层次转换,也可以说是强制转换,说道这里可能会想起C语言中的类型转换(有强制和隐式的)。对,他们是类似的,除此之外C++提供了更为安全的方法,即static_cast, dynamic_cast, const_cast, reinterpret_cast。

C中语法:

(type) name;//格式1
 type  name;//格式2

C++中新加入的语法:

static_cast<new_type>      (name)
dynamic_cast<new_type>     (name) 
const_cast<new_type>       (name) 
reinterpret_cast<new_type> (name)
1、static_cast
  • 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
  • 用于基本数据类型之间的转换(简单的截断),如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
  • 把空指针转换成目标类型的空指针。
  • 把任何类型的表达式转换成void类型。
针对第一点,其中基类到派生类的转换称为下行转换,派生类到基类的转换为上行转换。static_cast只在编译时对转换的安全性进行检查,没有运行时的类型检查。因此对它来说,上行转换是安全的,下行转换是不安全的。这是为什么呢?因为子类总是包含父类的所有属性和方法,因此上行转换,子类可以安全的到父类,也就是转换后可以随心所欲的访问转换后的对象成员(父类的)。反观下行转换,因为转换后的(子类)可能会有转换前没有的成员,这样访问就会越界,程序就会崩溃。并且static_cast在编译时并不会告诉你。
注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。

2、dynamic_cast

dynamic_cast主要用于类层次结构中父类和子类之间指针和引用的转换,由于具有运行时类型检查,因此可以保证下行转换的安全性,何为安全性?

对于指针,即转换成功就返回转换后的正确类型指针,如果转换失败,则返回NULL,之所以说static_cast在下行转换时不安全,是因为即使转换失败,它也不返回NULL。对与引用,失败了则抛出一个std::bad_cast异常。

在进行上行转换时,dynamic_cast和static_cast的效果是一样的;

在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。dynamic_cast是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。

3、const_cast

const_cast,用于修改类型的const或volatile属性。 

该运算符用来修改类型的const(唯一有此能力的C++-style转型操作符)或volatile属性。除了const 或volatile修饰之外, new_type和expression的类型是一样的。

①常量指针被转化成非常量的指针,并且仍然指向原来的对象;
②常量引用被转换成非常量的引用,并且仍然指向原来的对象;
③const_cast一般用于修改底指针。如const char *p形式。
4、reinterpret_cast

new_type必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。

reinterpret_cast意图执行低级转型,实际动作(及结果)可能取决于编辑器,这也就表示它不可移植

谨慎使用 reinterpret_cast。

少使用转型操作,尤其是dynamic_cast,耗时较高,会导致性能的下降,尽量使用其他方法替代。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值