首先说明,该内容主要摘自C++ STL 开发技术导引。
在C语言中,我们一般采用隐式类型转换,这样导致的结果是可读性不高。
如下这段代码
这段代码将double类型转换成了int类型,问题是如果别人来看这段代码的时候,别人可能就不知道这种转换是程序需要的还是编写代码的人不小心写错了呢。
因此,在C++程序中应尽量使用显示类型。C++的现实类型转换主要有4种:reinterpret_cast、static_cast、const_cast、dynamic_cast。
1、reinterpret_cast
reinterpret_cast类型转换函数主要用于指针类型之间的转换。它不改变指针变量值。在编译时重新解释指针的类型即可。
注意:它不能转换非指针类型,也不能将const类型指针转为非const类型的指针(这个可以用const_cast来实现)
2、const_cast
const_cast用来去除const指针的常量属性,即将const指针转为非const指针。 反过来也行。跟reinterpret_cast一样,它也不能转换非指针类型的变量或对象。它也是在编译期间完成类型更改。
3 、static_cast
static_cast主要用于基本类型之间和具有继承关系的类型之间的转换(只能将子类转为父类),该中转换一般会更爱变量的内部表示方式,因此static_cast应用于指针类型转换,没有多大意义,即使允许指针类型转换,也不及reinterpret_cast解释高效。
注:可以将父类与子类的指针 进行相互交换(即既可将子类指针转为父类指针,也可以将父类指针转为子类指针),编译都能通过,但是将父类指针转为子类指针时,会有一定的危害性。注意上面是说指针,在非指针的对象中,不能把父类转为子类。
4、dynamic_cast
dynamic_cast是与static_cast相对的,是动态转换。这种转换是在运行时进行转换分析的,而非在编译期,这也是它明显区别与以上三种转换方式的一个特征。dynamic_cast只能用于继承类对象的指针之间或引用之间 。进行转换时,会根据当前运行对象的运行时类型信息(Run-Time Type Indentification),判断类型对象之间的转换是否合法。若指针转换失败,将返回null指针。引用转换失败,则抛出一个bad_cast异常。