C++动态类型转换–少用类型转换
文章目录
前言
宁可用c++风格的新式转换const_cast , static_cast , dynamic_cast , reinterpret_cast,也不用旧式转换,如T(expression)
C++动态类型转换–少用类型转换
const_cast , static_cast , dynamic_cast , reinterpret_cast
二、C++ 四种强制转换类型函数
1.const_cast
因为不能把一个const变量直接赋给一个非const变量,必须要const_cast转换。
1、常量指针被转化成非常量的指针,并且仍然指向原来的对象;
2、常量引用被转换成非常量的引用,并且仍然指向原来的对象;
3、const_cast一般用于修改指针。如const char *p形式。
常量对象(或基本类型**)不可以被转换**成非常量对象(或基本类型)
2.static_cast
static_cast 作用和C语言风格强制转换的效果基本一样,由于没有运行时类型检查来保证转换的安全性,所以这类型的强制转换和C语言风格的强制转换都有安全隐患。
用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。注意:进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
用于基本数据类型之间的转换,如把int转换成char,把double转换成int。这种转换的安全性需要开发者来维护。
static_cast不能转换掉原有类型的const、volatile、或者 __unaligned属性。(前两种可以使用const_cast 来去除)
c++ primer 中说道:c++ 的任何的隐式转换都是使用 static_cast 来实现。
3.dynamic_cast
dynamic_cast主要执行安全向下转型,这就是说,你能用dynamic_cast把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针,说明dynami_cast 在程序运行时对类型转换对“运行期类型信息”(Runtime type information,RTTI)进行了检查.
使用dynamic_cast转换的Base类至少带有一个虚函数
对于“向下转型”有两种情况。
3.1 指针转换
一种是基类指针所指对象是派生类类型的,这种转换是安全的;
另一种是基类指针所指对象为基类类型,在这种情况下dynamic_cast在运行时做检查,转换失败,返回结果为0;
3.2 引用类型
在引用上,dynamic_cast依旧是常用于“安全的向下转型”。与指针一样,引用的向下转型也可以分为两种情况,与指针不同的是,并不存在空引用,所以引用的dynamic_cast检测失败时会抛出一个bad_cast异常:
dynamic_cast 许多版本很慢,如某个版本基于“class名称之字符串比较” 如果你在四层深的单继承体系内的某个对象执行dynamic_cast ,可能会调用4次strcmp
4.reinterpret_cast
reinterpret_cast是强制类型转换符用来处理无关类型转换的,通常为操作数的位模式提供较低层次的重新解释!但是他仅仅是重新解释了给出的对象的比特模型,并没有进行二进制的转换!
他是用在任意的指针之间的转换,引用之间的转换,指针和足够大的int型之间的转换,整数到指针的转换
reinterpret_cast执行低级转型,实际动作取决与编译器,意味着不可移植