"More Effective C++" 是一本关于提升C++编程效率和质量的书籍,由Scott Meyers撰写,侯捷翻译。书中包含了35个关键的编程实践和建议,涵盖了指针与引用的区别、类型转换、运算符重载、异常处理、效率优化等多个方面。
1. 指针与引用的区别(ITEM M1):指针可以为空,可以被重新赋值指向其他对象,而引用一旦初始化后必须始终引用一个有效的对象,不能为NULL,也不能改变引用的对象。
2. C++风格的类型转换(ITEM M2):推荐使用C++的静态类型转换(static_cast)和动态类型转换(dynamic_cast)代替C风格的类型转换,因为它们提供了更安全和明确的转换机制。
3. 不要对数组使用多态(ITEM M3):由于数组没有虚函数,因此无法通过基类指针调用派生类重写的成员函数,这限制了多态性在数组中的应用。
4. 避免无用的缺省构造函数(ITEM M4):如果类不需要默认构造函数,那么应该显式地声明为私有,防止不必要的实例化。
5. 谨慎定义类型转换函数(ITEM M5):自定义类型转换可能会导致难以预料的行为,应仅在确实需要且能确保安全时才使用。
6. 自增和自减操作符的区别(ITEM M6):前缀形式(++x和--x)的操作会立即改变对象的值,而后缀形式(x++和x--)会先返回当前值,再改变对象的值。
7. 不要重载逻辑运算符"&&", "||", 和 ","(ITEM M7):这些运算符具有特殊的短路行为,重载可能导致意外的结果。
8. 理解new和delete的不同含义(ITEM M8):new分配内存并构造对象,delete则销毁对象并释放内存,两者必须匹配使用,避免内存泄漏。
9. 使用析构函数防止资源泄漏(ITEM M9):析构函数在对象生命周期结束时自动执行,是释放资源的理想位置。
10. 构造函数中防止资源泄漏(ITEM M10):构造函数应确保即使在异常情况下也能正确清理资源。
11. 禁止异常信息传递到析构函数外(ITEM M11):析构函数应该不抛出异常,以免在异常处理过程中引起问题。
12. 抛出异常与参数传递和虚函数调用的差异(ITEM M12):抛出异常会导致当前作用域的撤销,而参数传递和虚函数调用不会。
13. 通过引用捕获异常(ITEM M13):捕获异常时使用引用可以避免异常对象的复制,提高效率。
14. 审慎使用异常规格(ITEM M14):异常规格可以提供编译时错误检查,但过度使用可能增加编译复杂性和代码维护难度。
15. 异常处理的系统开销(ITEM M15):异常处理会引入额外的运行时开销,因此应适度使用。
16. 80-20规则(ITEM M16):优化时关注最耗时的部分,通常20%的代码占据了80%的执行时间。
17. 懒惰计算法(ITEM M17):延迟计算直到真正需要结果时,可以减少不必要的计算。
18. 分期摊还期望的计算(ITEM M18):对于大型计算任务,可以分阶段进行,以减少一次性消耗的时间。
19. 临时对象的来源(ITEM M19):理解何时会产生临时对象,可以避免不必要的对象创建,提高性能。
20. 协助完成返回值优化(ITEM M20):通过特定的编码方式,可以减少因返回对象拷贝造成的开销。
21. 避免隐式类型转换(ITEM M21):通过重载运算符防止不期望的类型转换,提高代码清晰度和安全性。
22. 运算符赋值形式(ITEM M22):优先考虑提供赋值运算符(OP=),以支持对象间的赋值。
23. 考虑变更程序库(ITEM M23):当标准库或第三方库的功能不符合需求时,考虑自定义实现或选择更适合的库。
24. 虚函数、多继承、虚基类和RTTI的代价(ITEM M24):理解这些特性对内存占用和运行时性能的影响,合理使用。
本书通过这些深入的讨论和实践建议,旨在帮助开发者写出更高效、更可靠的C++代码,避免常见陷阱,并充分利用语言特性。每个条目都包含了详细的解释和示例,有助于读者提升编程技能。