在c++中,有旧式的转型,例如(int)a之类的用法,将变量a的类型转换成了int类型。也有新式的转型,例如static_cast之类的。
要注意的是,首先要少用转型,如果真的要用转型的话,也尽量用新式的转型,方便到时grep代码找到是在哪里进行的类型转换。
关于static_cast, const_cast, _dynamic_cast和reinterpret_cast的介绍可以参考链接
static_cast
static_cast是一个compile time cast,同时由于它没有做run time check,所以在对class指针进行转换的时候它是不能保证安全性的,需要程序员自己去检查。所以一般都是用来进行一些简单的数据类型转换,例如将enum转成int之类的。
dynamic_cast
dynamic_cast是一个run time cast,而且由于它会进行一个run time check,所以它的开销比较大,运行速度较慢。而且它仅仅能够转换指针和引用。它的语法如下所示:
dynamic_cast < type-id > ( expression )
它将expression转化成一个类型是type-id
的instance。其中type-id
一定是一个指向class的指针或者引用,又或者是一个void*
空指针。根据type-id
的类型,expression一定是个指针或者是个左值。它常用来根据继承的关系做一个up或者down的类型转换。up是指从derived class转换成base class,down是指从base class转换成derived class。
如果转换失败,dynamic_cast会返回一个nullptr。通常来讲,从derived class up回base class是安全的,但是从base class down到derived class是会失败的,会返回一个nullptr。如果是多重继承,有ambiguous的风险的话,编译器需要我们手动转换路径,具体可参考上面的链接。
const_cast
const_cast的语法如下所示:
const_cast < type-id > ( expression )
它通常用于将const类型转换成非const类型。