C++编码军规(002):避免在C++中使用C形式的强制类型转换

来源:互联网 发布:能在淘宝买燕尾型材吗 编辑:程序博客网 时间:2024/05/21 05:19

军规 避免在C++中使用C形式的强制类型转换


Never use C-style casts within C++

解读


(1)何时需要强制类型转换

先看下面的例子

int ival;double dval;ival  = ival * dval;

上述例子中,一个int整形数与一个double类型的浮点数相乘,按照C++内部默认的隐式的转换规则,编译器会首先将ival转换为double类型,然后与dval相乘,最后将相乘的结果(浮点)去掉浮点部分赋值给ival。在这个例子中,将int转换为double是没有必要的,因为3转换为3.000没有任何数值大小上面的改变,所以为了省略这一步骤,我们可以这么干:

int ival;doubel dval;ival = ival * (int)dval;

我们直接将dval强制转换为int类型后与ival相乘得到结果。这是一个需要做强制类型转换的比较简单的例子。

(2)C风格 VS C++风格

对于上面强制类型转换的例子,在C++中建议使用命名的强制类型转换,如ival = ival * static_cast<int>(dval), 尽管(int)dvalstatic_cast<int>(dval)在效果上是一样的,但C风格的类型转换可读性比较差,难以跟踪错误的转换。
此外,C++保留C风格的强制类型转换是为了兼容“在C++标准之前写的程序”,并保持与C语言的兼容性。在新的C++程序设计中我们应该采用新式的类型转换,如static_cast、const_cast以及reinterpret_cast.

(3)关于强制类型转换的深入思考

在C++ Primer中关于强制类型转换有这么一句话:设计合理的系统不应该频繁使用xx_cast强制类型转换,否则将意味着设计的缺陷。这句话告诉我们在使用xx_cast的时候要仔细思考一下是不是设计上有缺陷,不用xx_cast也能写出非常好的C++程序。当然这不是说用了xx_cast就表明程序的设计是糟糕的,有时候我们的确需要用到强制类型转换,否则C++标准就没必要设计xx_cast供我们使用了。一件事物的存在必然有它的必要,我们需要辩证地去看待这些问题。

(4)最佳实践

  • 如果能避免使用强制类型转换就要避免
  • 如果必须要用到强制类型转换使用C++风格的xx_cast代替旧式的C风格的类型转换。
  • 在使用前多想思考一些是否设计上有缺陷
0 0
原创粉丝点击