1.const_cast
看见const,大家第一反映就是关键字,对这个类型装换和const关键字相关。这个类型转换用来舍弃变量的不可变特性。实际在过程中,其实我们不许要使用这个类型转换。但是可能在使用第三方库的时候不如你所愿,库对你是不可见的,所以你需要这个转换。
2.static_cast
static_cast是我们使用的最多的类型转换。它显示地执行C++语言直接支持的转换,比如int转换为double。对于自定义的类类型,只要提供了关键的构造函数或者转换例程也可以进行显示的转换。
static_cast可以用于指针和引用,但是不能用与对象本身。很遗憾,它不进行类型检测,第四中介绍的类型转换会进行类型检测。
3.reinterpret_cast
reinterpret的中文释义为重新解释,你可想而知,这个转换是多么的强大,你可以重新解释一个东西。两个指针指向的对象可以没有继承层次,你可以装换,当然应用也会可以的,即使他们之间什么关系也没。这个关键字经常被用来将指针转换为void*(其实这个过程static_cast也可以)以及逆过程。
你使用它将指针转换成int和int装换成指针。虽然在某些情况下可以,但是移植行很差,比如在64位平台,指针是64位,而int可能是32位。
4.dynamic_cast
dynamic释义动态的。它为继承层次结构内的类型提供运行时检测,需要RTTI(real time type infomation)支持。它可以装换指针和引用,在运行时检测对象类型,如果转换没有意义,对于指针返回一个空指针,对于引用抛出一个
bad_cast异常。
由于对象运行时类型信息存储在对象的虚表中,为了可以使用dynamic_cast,需要类拥有一个虚函数。没有虚表的话,尝试使用它,对得到一个编译错误。
使用static_cast和reinterpret_cast都可以沿着继承层次向下转型。不过dynamic_cast进行运行时检测,可能性能有那么一丁点影响,不过很安全。