在C语言中,类型转换只需要在变量前加上转换的类型即可,而且转换可以是双向的,但是这种粗暴的类型对付基本类型还可以,对付复杂类型就力不从心了。因此C++提供了四种类型转换操作符:static_cast、dynamic_cast、const_cast、reinterpret
(1)static_cast
static_cast可以完全代替C风格的类型转换实现基本类型的转换。此外可以将父类指针转换为子类指针,也可以将子类指针转换为父类指针,但是如果两个类是不相关的,无法相互转换。但是需要注意的是:如果父类指针指向的父类对象,此时将父类指针转换为子类指针虽然可以通过static_cast实现,但是这种转换可能是不安全的,如果父类指针本身指向一个子类对象,则不存在安全问题。
(2)dynamic_cast
dynamic_cast只能用于对象指针之间的类型转换,可以将父类指针转换为子类指针,也可以将子类指针转换为父类指针,此外转换结果也可以是引用。与static_cast的区别是,dynamic_cast在将父类指针转换为子类指针过程中,对背后的类型进行检查保证类型完全匹配,但是static_cast不会这样做。只有当一个父类指针指向子类对象时,并且父类中包含虚函数时,使用dynamic_cast才会成功,否则返回NULL指针,如果是引用则抛出异常。
(3)const_cast
const_cast可以在转换的过程中增加或者删除const属性。一般无法将常量指针直接赋给普通指针,但是通过const_cast可以移除常量指针的const属性,实现const指针到非const指针的转换。
(4)reinterpret_cast
reinterprep_cast可以将一种类型的指针直接转换为另一种类型的指针,不论两个类之间是否有继承关系。还可以将一个指针转换为一个整数,也可以将一个整数转换为一个指针。还可以用于不同函数指针之间的转换。