在C语言里面,使用括号加类型这种方式进行类型转换,我们将此转型操作符为旧式转型操作符。旧式转型操作符具有不少缺点。首先是职责不明确。旧式转型操作符几乎允许你将任何类型转换为任何其他类型,出错的概率也相应增加。其次是旧式转型操作符难以辨识。旧式转型操作符使用小括号进行类型转换,而小括号在C++的任何其他地方都可能使用,这导致人们难以辨识某个程序是否使用了转型操作。
C++则提供了四种职责明确的新型转型操作符,分别是:static_cast,const_cast,dynamic_cast,和reinterpret_cast。其语法形式为:
(type) expression
改成,
static_cast<type>(expression)
可以看到,C++新型转型操作符十分被辨识出来。
一、static_cast转型操作符
static_cast基本上与C旧式转型操作符具有相同的功能和相同的限制。不同的是旧式转型操作符还可以去除变量的常量性,但由于C++已提供了另一转型操作符const_cast专司该职,static_cast并不可以去除变量的常量性。
所以说,大多数情况下,在使用旧式转型操作符的地方,我们都可以使用static_cast来代替。
二、const_cast转型操作符
const_cast专门用来改变是的常量性和可变性。值得指出的是,一常量性对象通过const_cast去除常量性后,可以通过代码更改其值。
三、dynamic_cast转型操作符
dynamic_cast用来执行继续体系中安全的向下转型操作。即,使用dynamic_cast,可以将一个指向基类的指针或者引用转换成指向其派生类的指针或者引用,并得知转换是否成功。如果转型失败,会以一个null指针或者exception表现出来。
使用dynamic_cast只能在继承体系中实施转型,而且要求基类具有虚函数。
四、reinterpret_cast转型操作符
reinterpret_cast允许将任意的指针类型转换成其他任意的指针类型,同时也允许将任意的整型类型转换成任意的指针类型,或者将任意的指针类型转换成任意的整型类型。例如,可以使用einterpret_cast将char*类型转换成int*类型,或者One_class*类型转换成Unrelate_class*类型。
reinterpret_cast转换的范围相当大,这也导致reinterpret_cast在使用中相当容易出错。另外,由于reinterpret_cast转型操作符与编译平台相关,故它不具有移植性。
参考资料:
1. 《More Effective C++ 35个改善编程与设计的有效方法》Scott Meyers著, 侯捷译
2. MSDN http://msdn.microsoft.com/en-us/library/e0w9f63b(v=vs.110).aspx