旧式转型的缺点
- 旧式的C转型方式几乎允许任何类型转换为其他类型,这是十分拙劣的。如果每次转型都能够更精准地指明意图会更好。
- 旧式转型难以辨别。旧式转型的语法结构是由一对小括号加上一个对象名称(标识符)组成,而小括号和对象名称在C++的任何地方都有可能被使用。
为了解决C旧式转型的缺点,C++引入了4种新的转换操作符:
static_cast
static_cast基本拥有与C旧式转型相同的威力与意义,以及相同的限制。其他的新式转型操作符应用于更集中的目的。
const_cast
const_cast用来改变表达式的常量性(constness)和易变性(volatileness),它常见的用途是将某个对象的常量性去掉。
dynamic_cast
dynamic_cast用来执行继承体系种的"安全的向下转型或跨系转型动作"。即用dynamic_cast将"指向base class object的pointers或reference"转型为"指向derived class objects的pointers或reference",并返回转型是否成功。如果失败,会以一个null指针(转型对象为指针)或者一个exception(转型对象为引用)表现出来。dynamic_cast只能用来巡航于继承体系中,无法应用在缺乏虚函数的类型上,也不能改变类型的常量性(constness)。
reinterpret_cast
reinterpret_cast转换结果几乎总是于编译平台息息相关。所以它不具备移植性。它是最强也最毫无顾虑的转换操作符。
过去的习惯写法:(type)expression
。现在可以改为:xxx_cast<type>(express)
。
总结
C旧式操作符依旧可以使用,但是这样也就丧失了新式类型转换操作符所提供的严谨意义与易辨识度。如果在程序中使用新式转换法,比较容器被解析(无论是对人类还是对工具而言),编译器也因此得以专断转型错误(那是旧式转型法侦测不到的)。