深入理解Effective C++:侯捷翻译的编程精髓

需积分: 11 1 下载量 77 浏览量 更新于2024-07-21 收藏 1.38MB PDF 举报
"More_Effective_C++(中文版).侯捷" 本书是Scott Meyers的经典之作《More Effective C++》的中文译本,由著名C++专家侯捷翻译。该书深入探讨了C++编程语言中的一些易被忽视的细节和技术,旨在帮助读者提升C++编程的技能和效率。书中包含35个重要的编程项,覆盖了基础议题、运算符、异常处理和效率提升等多个方面。 1. 基础议题: - 指针与引用的区别:指针可以为空,可以被重新赋值,而引用一旦初始化就不能改变;引用更安全,不能为NULL。 - C++风格的类型转换:推荐使用static_cast、dynamic_cast、const_cast和reinterpret_cast代替传统的C风格转换,以增加代码的清晰性和安全性。 - 不要对数组使用多态:由于数组没有虚函数,无法实现多态性,应优先考虑使用动态分配的对象数组或容器如std::vector。 - 避免无用的缺省构造函数:在不需要时,不要提供缺省构造函数,以免产生不必要的对象初始化。 2. 运算符: - 定义类型转换函数要谨慎:防止类型转换可能导致的错误或意外行为,确保转换的明确性和安全性。 - 自增和自减操作符的前缀和后缀形式:前缀操作符会先自增/自减然后返回结果,后缀操作符则相反,先返回副本再进行操作。 - 不重载逻辑运算符"&&"、"||"和逗号运算符:这些运算符有特殊的短路逻辑,重载可能导致行为不符合预期。 - 理解new和delete的不同用法:new用于动态分配内存,delete用于释放,它们有对应的数组版本,需要匹配使用,避免内存泄漏。 3. 异常处理: - 使用析构函数防止资源泄漏:析构函数在对象生命周期结束时自动执行,适合清理资源。 - 构造函数中防止资源泄漏:构造函数异常时,确保资源已正确释放或未分配。 - 禁止异常信息传递到析构函数外:析构函数应保证不抛出异常,以维护程序的稳定。 - 区分“抛出一个异常”与“传递一个参数”或“调用一个虚函数”:异常处理是程序的非正常流程,不应与普通调用混淆。 - 异常捕获时使用引用:捕获异常时使用引用能保证异常对象不会被复制,提高效率。 - 审慎使用异常规格:异常规格可能导致编译器进行异常安全性检查,但过度使用可能引入额外开销。 - 了解异常处理的系统开销:异常处理会带来一定的性能损失,因此应适度使用。 4. 效率优化: - 遵循80-20法则:关注并优化代码中影响性能的关键20%部分。 - 考虑懒惰计算:推迟计算直到真正需要时,减少不必要的计算。 - 分期摊还期望的计算:利用局部性原理,将昂贵的计算分摊到多次使用中。 - 临时对象的来源:了解何时会产生临时对象,以优化拷贝构造和赋值操作。 - 协助完成返回值优化:通过特定的编码技巧,避免因返回对象而导致的额外拷贝。 - 通过重载避免隐式类型转换:防止隐式转换可能导致的意外行为。 - 运算符赋值形式:优先使用OP=形式,以支持链式赋值并确保正确处理右侧表达式。 - 考虑变更程序库:根据项目需求选择最适合的库,优化性能和可维护性。 - 了解虚函数、多继承、虚基类和RTTI的代价:理解这些特性带来的内存和运行时成本。 《More Effective C++》是一本深度揭示C++语言特性的书籍,通过实例和建议帮助开发者写出更高效、更安全的C++代码。