编程好习惯2——尽量避免使用强制类型转换

        强制类型转换意味着关闭或挂起了编译器正常的类型检查功能,即编译器在强制类型转换发生处并不会发出警告,但是最好别用强制类型转换,不用强制类型转换也可以也出很好的C++程序。

       不论是使用新型的强制类型转换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对象这两个应用发生在不同文件中的时候。

 

你可能感兴趣的:(编程好习惯2——尽量避免使用强制类型转换)