15.5 类型转换运算符(1)
在C++(www.cppentry.com)的创始人Bjarne Stroustrup看来,C语言中的类型转换运算符太过松散。例如,请看下面的代码:
首先,上述3种类型转换中,哪一种有意义?除非不讲理,否则它们中没有一个是有意义的。其次,这3种类型转换中哪种是允许的呢?在C语言中都是允许的。
对于这种松散情况,Stroustrop采取的措施是,更严格地限制允许的类型转换,并添加4个类型转换运算符,使转换过程更规范:
dynamic_cast;
const_cast;
static_cast;
reinterpret_cast。
可以根据目的选择一个适合的运算符,而不是使用通用的类型转换。这指出了进行类型转换的原因,并让编译器能够检查程序的行为是否与设计者想法吻合。
dynamic_cast运算符已经在前面介绍过了。总之,假设High和Low是两个类,而ph和pl的类型分别为High *和Low *,则仅当Low是High的可访问基类(直接或间接)时,下面的语句才将一个Low*指针赋给pl:
否则,该语句将空指针赋给pl。通常,该运算符的语法如下:
该运算符的用途是,使得能够在类层次结构中进行向上转换(由于is-a关系,这样的类型转换是安全的),而不允许其他转换。
const_cast运算符用于执行只有一种用途的类型转换,即改变值为const或volatile,其语法与dynamic_cast运算符相同:
如果类型的其他方面也被修改,则上述类型转换将出错。也就是说,除了const或volatile特征(有或无)可以不同外,type_name和expression的类型必须相同。再次假设High和Low是两个类:
第一个类型转换使得*pb成为一个可用于修改bar对象值的指针,它删除const标签。第二个类型转换是非法的,因为它同时尝试将类型从const High *改为const Low *。
提供该运算符的原因是,有时候可能需要这样一个值,它在大多数时候是常量,而有时又是可以修改的。在这种情况下,可以将这个值声明为const,并在需要修改它的时候,使用const_cast。这也可以通过通用类型转换来实现,但通用转换也可能同时改变类型: