前言
题目中这些都是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不能转换掉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的类型是一样的。
4、reinterpret_cast
new_type必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。
reinterpret_cast意图执行低级转型,实际动作(及结果)可能取决于编辑器,这也就表示它不可移植。
谨慎使用 reinterpret_cast。
少使用转型操作,尤其是dynamic_cast,耗时较高,会导致性能的下降,尽量使用其他方法替代。