不论是使用新型的强制类型转换reinterpret_cast、const_cast、static_cast、dynamic_cast还是旧式强制类型转换,都有可能给整个程序埋下难以预料的问题,每次使用强制类型转换之前,最好想一想能不能采用其它的方法达到同样的目的,如果非使用不可,则应限制强制类型转换值的作用域,并且记录所有强制转换的位置,这样可以减少错误发生的机会也便于调试。
例如:
int *ip;
char *cp = reinterpret_cast<char*>(ip);
程序员必须永远记得 cp 所指向的真实对象其实是 int 型,而并非字符数组。任何假设cp是普通字符指针的应用,都有可能带来有趣的运行时错误。例如,下面语句用 cp 来初始化一个 string 对象:
string str(pc);
它可能会引起运行时的怪异行为。用 cp 初始化 str 这个例子很好地说明了显式强制转换是多么的危险。问题源于类型已经改变 时编译器没有提供任何警告或错误提示。当我们用 int 型地址初始化cp时,由于显式地声明了这样的转换是正确的,因此编译器不提供任何错误或警告信息。后面对cp的使用都假设它存放的是 char* 型对象的地址,编译器确实无法知道 cp 实际上是指向 int 型对象的指针。因此用cp初始化 str 是完全正确的——虽然实际上是无意义的或是错误的。查找这类问题的原因相当困难,特别是如果 ip 到cp 的强制转换和使用cp 初始化 string对象这两个应用发生在不同文件中的时候。