(YuleFox注:对于异常处理,显然不是短短几句话能够说清楚的,以构造函数为例,很多C++书籍上都提到当构造失败时只有异常可以处理,Google禁止使用异常这一点,仅仅是为了自身的方便,说大了,无非是基于软件管理成本上,实际使用中还是自己决定)
运行时类型识别:我们禁止使用RTTI.
定义:RTTI允许程序员在运行时识别C++类对象的类型.
优点:RTTI在某些单元测试中非常有用.比如进行工厂类测试时,用来验证一个新建对象是否为期望的动态类型.除测试外,极少用到.
缺点:在运行时判断类型通常意味着设计问题.如果你需要在运行期间确定一个对象的类型,这通常说明你需要考虑重新设计你的类.
结论:(1)、除单元测试外,不要使用RTTI.如果你发现自己不得不写一些行为逻辑取决于对象类型的代码,考虑换一种方式判断对象类型.(2)、如果要实现根据子类类型来确定执行不同逻辑代码,虚函数无疑更合适.在对象内部就可以处理类型识别问题.(3)、如果要在对象外部的代码中判断类型,考虑使用双重分派方案,如访问者模式.可以方便的在对象本身之外确定类的类型.(4)、如果你认为上面的方法你真的掌握不了,你可以使用RTTI,但务必请三思:-).不要试图手工实现一个貌似RTTI的替代方案,我们反对使用RTTI的理由,同样适用于那些在类型继承体系上使用类型标签的替代方案.
类型转换:使用C++的类型转换,如static_cast<>().不要使用int y = (int)x或int y =int(x)等转换方式;
定义:C++采用了有别于C的类型转换机制,对转换操作进行归类.
优点:C语言的类型转换问题在于模棱两可的操作;有时是在做强制转换(如(int)3.5),有时是在做类型转换(如(int)"hello").另外,C++的类型转换在查找时更醒目.
缺点:恶心的语法.
结论:不要使用C风格类型转换.而应该使用C++风格.(1)、用static_cast替代C风格的值转换,或某个类指针需要明确的向上转换为父类指针时.(2)、用const_cast去掉const限定符.(3)、用reinterpret_cast指针类型和整型或其它指针之间进行不安全的相互转换.仅在你对所做一切了然于心时使用.(4)、dynamic_cast测试代码以外不要使用.除非是单元测试,如果你需要在运行时确定类型信息,说明有设计缺陷.
流:只在记录日志时使用流.
定义:流用来替代printf()和scanf().
优点:有了流,在打印时不需要关心对象的类型.不用担心格式化字符串与参数列表不匹配(虽然在gcc中使用printf也不存在这个问题).流的构造和析构函数会自动打开和关闭对应的文件.
缺点:流使得pread()等功能函数很难执行.如果不使用printf风格的格式化字符串,某些格式化操作(尤其是常用的格式字符串%.*s)用流处理性能是很低的.流不支持字符串操作符重新排序(%1s),而这一点对于软件国际化很有用.
结论:不要使用流,除非是日志接口需要.使用printf之类的代替.
使用流还有很多利弊,但代码一致性胜过一切.不要在代码中使用流.
拓展讨论:对这一条规则存在一些争论,这儿给出点深层次原因.回想一下唯一性原则(OnlyOne Way):我们希望在任何时候都只使用一种确定的I/O类型,使代码在所有I/O处都保持一致.因此,我们不希望用户来决定是使用流还是printf + read/write.相反,我们应该决定到底用哪一种方式.把日志作为特例是因为日志是一个非常独特的应用,还有一些是历史原因.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-35033-12.html
加油啊看好你哟~
千千
为了民族兴旺
那我肯定不说了