"More Effective C++中文版,由著名C++专家Scott Meyers撰写,侯捷翻译,包含35个提升C++编程效率和质量的建议。本书深入探讨了C++中的基础议题、运算符、异常处理和效率优化等关键概念,并提供了许多实用的编程技巧和惯用法(idioms)。"
1. 指针与引用的区别(ITEM M1):C++中的指针可以为空,可被重新赋值,而引用一旦初始化后必须始终引用一个对象,不能为NULL,也不能改变引用本身。引用提供了一种安全且不会丢失的别名机制。
2. 类型转换(ITEM M2):C++提供了C-style类型转换和C++-style类型转换。C++-style转换(如static_cast, dynamic_cast, reinterpret_cast, const_cast)更安全,更具有控制性,推荐在需要转换时使用。
3. 多态与数组(ITEM M3):由于多态性在运行时才确定,因此对数组使用多态可能会导致未定义的行为,尤其是当数组元素是基类指针,但实际指向派生类对象时。
4. 缺省构造函数(ITEM M4):避免无用的缺省构造函数,除非确实需要,因为它们可能导致不必要的对象初始化,占用额外资源。
5. 类型转换函数(ITEM M5):谨慎定义类型转换函数,因为它们可能引发隐式转换,导致难以预料的行为。通常,应优先使用显式转换(explicit)来控制转换过程。
6. 自增和自减操作符(ITEM M6):前缀和后缀自增/自减操作符在运算顺序和返回值上有显著区别,前缀操作符首先更新对象,然后返回新值;后缀操作符先返回旧值,再更新对象。
7. 重载运算符(ITEM M7):避免重载逻辑与("&&")、逻辑或("||")和逗号运算符(","),因为它们有特殊的结合性和短路性质,重载可能导致混淆和错误。
8. new和delete的不同含义(ITEM M8):new用于动态内存分配,而delete用于释放内存。理解两者在数组和非数组形式下的差异至关重要,以防止内存泄漏。
9. 异常处理(ITEM M9):析构函数应确保资源的正确释放,即使在异常发生时也能执行,这是防止资源泄漏的重要手段。
10. 构造函数中的异常处理(ITEM M10):在构造函数中应尽早获取和管理资源,以确保在异常发生时能正确释放。
11. 异常传递(ITEM M11):禁止异常信息传递到析构函数外部,以保持异常安全性,防止资源清理失败。
12. 抛出异常与参数传递、虚函数调用的区别(ITEM M12):抛出异常会改变控制流,而参数传递和虚函数调用不会,这影响程序的性能和结构。
13. 异常捕获(ITEM M14):捕获异常时,通常通过引用而不是值,以避免异常对象的复制,提高效率。
14. 异常规格(ITEM M15):异常规格可以指定函数预期抛出的异常类型,但过度使用或误用可能引入编译器约束,增加代码维护难度。
15. 效率优化(ITEM M16):遵循80-20规则,关注对性能影响最大的20%代码进行优化。
16. 懒惰计算法(ITEM M17):延迟计算直到真正需要,以减少不必要的计算和提高效率。
17. 计算分期摊还(ITEM M18):对于预期的计算成本,可以分摊到多个步骤中,以降低每次操作的影响。
18. 临时对象(ITEM M19):理解何时和如何创建临时对象,以及它们在表达式中的作用,有助于优化代码。
19. 返回值优化(ITEM M20):通过协助编译器实现返回值优化,可以避免不必要的拷贝,提高效率。
20. 避免隐式类型转换(ITEM M21):通过重载操作符防止隐式类型转换,使代码更清晰,减少意外行为。
21. 运算符赋值形式(ITEM M22):考虑使用运算符赋值形式(如operator=)替代单独形式(如operator+),以支持复合赋值并确保资源管理的一致性。
22. 考虑变更程序库(ITEM M23):有时,替换或升级现有库可以带来性能提升和功能增强。
23. 多态、多继承、虚基类和RTTI的成本(ITEM M24):理解这些特性背后的开销,以便在设计时做出明智的权衡。
24. 技巧和惯用法(IDIOMS):书中还包括一些C++编程中的常见技巧和惯用法,帮助开发者写出更高效、更可靠的代码。
《More Effective C++》是一本深入剖析C++编程实践的书籍,它提供的建议和技巧对于提升C++程序员的专业技能和代码质量大有裨益。