15.5 类型转换运算符(2)
由于编程(www.cppentry.com)时可能无意间同时改变类型和常量特征,因此使用const_cast运算符更安全。
const_cast不是万能的。它可以修改指向一个值的指针,但修改const值的结果是不确定的。程序清单15.19的简单示例阐明了这一点:
程序清单15.19 constcast.cpp
const_cast运算符可以删除const int* pt中的const,使得编译器能够接受change( )中的语句:
但由于pop2被声明为const,因此编译器可能禁止修改它,如下面的输出所示:
正如您看到的,调用change( )时,修改了pop1,但没有修改pop2。在chang( )中,指针被声明为const int *,因此不能用来修改指向的int。指针pc删除了const特征,因此可用来修改指向的值,但仅当指向的值不是const时才可行。因此,pc可用于修改pop1,但不能用于修改pop2。
static_cast运算符的语法与其他类型转换运算符相同:
仅当type_name可被隐式转换为expression所属的类型或expression可被隐式转换为type_name所属的类型时,上述转换才是合法的,否则将出错。假设High是Low的基类,而Pond是一个无关的类,则从High到Low的转换、从Low到High的转换都是合法的,而从Low到Pond的转换是不允许的:
第一种转换是合法的,因为向上转换可以显示地进行。第二种转换是从基类指针到派生类指针,在不进行显示类型转换的情况下,将无法进行。但由于无需进行类型转换,便可以进行另一个方向的类型转换,因此使用static_cast来进行向下转换是合法的。
同理,由于无需进行类型转换,枚举值就可以被转换为整型,所以可以用static_cast将整型转换为枚举值。同样,可以使用static_cast将double转换为int、将float转换为long以及其他各种数值转换。
reinterpret_cast运算符用于天生危险的类型转换。它不允许删除const,但会执行其他令人生厌的操作。有时程序员必须做一些依赖于实现的、令人生厌的操作,使用reinterpret_cast运算符可以简化对这种行为的跟踪工作。该运算符的语法与另外3个相同:
下面是一个使用示例:
通常,这样的转换适用于依赖于实现的底层编程(www.cppentry.com)技术,是不可移植的。例如,不同系统在存储多字节整型时,可能以不同的顺序存储其中的字节。
然而,reinterprete_cast运算符并不支持所有的类型转换。例如,可以将指针类型转换为足以存储指针表示的整型,但不能将指针转换为更小的整型或浮点型。另一个限制是,不能将函数指针转换为数据指针,反之亦然。
在C++(www.cppentry.com)中,普通类型转换也受到限制。基本上,可以执行其他类型转换可执行的操作,加上一些组合,如static_cast或reinterpret_cast后跟const_cast,但不能执行其他转换。因此,下面的类型转换在C语言中是允许的,但在C++(www.cppentry.com)中通常不允许,因为对于大多数C++(www.cppentry.com)实现,char类型都太小,不能存储指针:
这些限制是合理的,如果您觉得这种限制难以忍受,可以使用C语言。