27. 尽量少做转型动作
- c++提供四种新式转型:
1)const_cast<T>(expression)——唯一可以移除对象常量性的c+±style转型操作符。
2)dynamic_cast<T>(expression)——决定某对象是否归属继承体系中的某个类型,“安全向下转型”。(就是将基类转型为继承类),实现版本执行速度相当慢,效率低。
3)reinterpret_cast<T>(expression)——低级转型
4)static_cast<T>(expression)——强迫隐式转换(例如转为const对象)
-
使用新型转型有利于在代码中识别,并且其目标窄化,有利用编译器诊断出错误运用。
-
类型转换并不是告诉编译器把某种类型视为另一种类型,其会令编译器编译出运行期间执行的代码。
总结:
如果可以,应该避免转型;如果是注重效率的代码中,应该避免dynamic_casts.
28. 避免返回handles指向对象内部成分
handles包括引用、指针和迭代器,如果返回一个“代表对象内部数据”的handle,带来的就是降低对象封装性的风险。
对象内部指的是private或protected的成员变量或函数。
dangling handles指的是所指东西的所属对象不复存在。
总结:避免返回handles指向对象内部成分就是避免这种风险:有个handle被传出去了,那么就被暴露在handle比所指对象更长寿的风险下【eg:handles指向的对象到达了作用域然后被析构了,此时handles就指向了一个不复存在的对象了,变成dangling handles】。并还能增加封装性。
29. 为“异常安全”而努力是值得的
- 异常安全性有两个条件:
1)不泄露任何资源。(这个要注意new,malloc函数)——RAII解决。
2)不允许数据败坏 - 异常安全函数提供三个保证之一:
1)基本承诺:异常抛出后,所有对象处于一种内部前后一致的状态,即数据没有被破坏。
2)强烈保证:函数如果失败,则程序回复到“调用函数之前”的状态。
3)nothrow保证:承诺不抛出异常,因为可以完成预期功能。eg:作用于内置类型(如int)的所有操作都提供nothrow保证。 - 异常安全码必须提供三个保证之一。
- “强烈保证”往往能以copy-and-swap实现出来,但其时间和空间效率低,一般不予采取。
总结:从条件和保证两方面进行考虑异常安全,从而检查自己写的函数是否实现异常安全。
30. 透彻了解inlining的里里外外
- inline函数:看起来像函数,动作像函数,但调用时不会有额外开销,又比宏好的多,因为检查了参数类型。
- 整体观念:对inline函数的每一个调用都以函数本体替换,这将会增加object code,造成代码膨胀。
- 如果inline函数本体小,使本体替换比函数调用产出的码小,那效率更高。
- inline函数的位置:通常一定被置于头文件,因为大多数编译环境在编译过程就进行inlining。
- inline函数的约束:大部分编译器拒绝将太过复杂,如带有循环或递归的函数inlining,以及拒绝将virtual函数inlining,因为virtual以为直到运行期才知道用哪个函数。
- 继承类的构造函数即使是个空,但是其也只是表面是个空,实际上其会先调用基类的构造函数,然后再调用成员变量类型的构造函数。
- inlining函数不支持设立断点,所以不能进行调试。
- inlining函数如果发生变化,那么就要重新编译,如果他不是inlining函数,那么重新链接即可。
总结:inlining函数也有很多约束和弊端,所以当且仅当函数体比较小型并被频繁调用时,我们才考虑使用inlining函数。
31. 将文件间的编译依存关系降至最低
1)即实现“接口与实现分离”。分离的关键在于以“声明的依存性”替换“定义的依存性”。其设计策略为:
- 优先考虑使用object 引用或指针完成任务
- 如果可以,尽量以class声明式替换class定义式
- 为声明式和定义式提供不同的头文件
2)如果可以将提供class定义式从函数声明的头文件中转移到内含函数调用的客户文件,则可将“并非真正必要之类型定义”与客户端之间的殡仪依存性去除掉。
3)接口函数和实现函数的成员函数完全相同,两个接口完全相同。让接口类调用实现类的指针,从而使接口类变成一个handle class,不改变其做的事,而改变它做事的方法。
4)或者接口类中定义的全是纯虚函数,从而成为一个interface classes
总结:支持“编译依存性最小化”的一般构想是:相依于声明式,不相依于定义式。两个手段是handle classes和interface classes
本文深入探讨C++编程的关键实践,包括转型操作的正确使用、提高异常安全性、理解inlining的利弊及最小化编译依赖,旨在提升代码质量和效率。
3349

被折叠的 条评论
为什么被折叠?



