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

军规 避免在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风格的类型转换。
  • 在使用前多想思考一些是否设计上有缺陷
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.大学生活丰富多彩,会令你一生都难忘,但难忘有很多种,你可以学了很多东西而难忘,也会因为什么都没学到而难忘!   2.计算机专业是一个很枯燥的专业,但即来之、则安之,只要你努力学,也会发现其的乐趣的。   3.记住:万丈高楼平地起!基础很重要,尤其是专业基础课,只有打好基础才能学得更深。   4.C语言是基础,很重要,如果你不学好C语言,那么什么高级语言你都学不好。   5.C语言C++语言是两回事。就像大熊猫和小熊猫一样,只是名字很像。   6.请先学习专业课《数据结构》、《计算机组成原理》,不要刚开始就拿着一本VC在看,你连面向对象都搞不清楚,看VC没有任何用处。   7.对编程有一定的认识后,就可以学习C++了。(是C++而不是VC,这两个也是两码事。C++是一门语言,而VC教程则是讲解如何使用MFC类库,学习VC应建立在充分了解C++的基础之上。看VC的书,是学不了C++语言的。)   8.学习编程的秘诀是:编程,编程,再编程;   9.认真学习每一门专业课,那是你今后的饭碗。   10.在学校的实验室就算你做错一万次程序都不会有人骂你,如果在公司你试试看!所以多去实验室上机,现在错得多了,毕业后就错得少了。   11.从现在开始,在写程序时就要养成良好的习惯。   12.不要漏掉书任何一个练习题——请全部做完并记录下解题思路。   13.你会买好多参考书,那么请把书上的程序例子亲手输入到电脑上实践,即使配套光盘有源代码。   14.VC、C#、.NET这些东西都会过时,不会过时的是数据结构和优秀的算法!   15.记住:书到用时方恨少。不要让这种事发生在你身上,在学校你有充足的时间和条件读书,多读书,如果有条件多读原版书,你要知道,当一个翻译者翻译一本书时,他会不知不觉把他的理念写进书,那本书就会变得像鸡肋!   16.我还是强调认真听专业课,因为有些课像《数据结构》、《编译原理》、《操作系统》等等,这种课老师讲一分钟能让你明白的内容,你自己看要看好几个月,有的甚至看了好几年都看不明白。   17.抓住在学校里的各种实践的机会,要为自己积累经验,就业时经验比什么都有用。   18.多去图书馆,每个学校的图书馆都有很多好书等你去看!   19.编程不是技术活,而是体力活。   20.如果你决定了要当一个好的程序员,那么请你放弃游戏,除非你是那种每天只要玩游戏就能写出好程序的天才!   21.你要有足够的韧性和毅力!有个高手出一一道题测试你的韧性和毅力:找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。   22.找到只属于你自己的学习方法。不要盲目的追随别人的方法,适合自己的才是最好的!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值