### 更Effective C++ #### 译序与导读 《More Effective C++》是继《Effective C++》之后由Scott Meyers撰写的另一部力作。本书深入解析了C++的使用技巧和技术内幕,对于想要深入了解C++语言特性的程序员来说是一本不可或缺的指南。 #### 本书所谈的C++ 本书主要探讨了C++编程中的高级主题,包括但不限于指针与引用的区别、类型转换的最佳实践、多态性在数组中的应用限制等。通过这些深入的技术分析,帮助读者更好地理解和运用C++的各种特性。 #### 惯例与术语 书中介绍了一些C++编程中常见的惯例和术语,如Item这样的条目分类方式,使得读者可以方便地查阅特定主题的内容。此外,书中还提供了一些专业术语的解释,以便于初学者理解和掌握。 #### 臭虫报告,意见提供,内容更新 作者鼓励读者反馈书中可能存在的错误或者提出改进建议,并承诺会根据反馈进行内容的更新和完善。这种互动的方式有助于保持书籍内容的准确性和时效性。 ### 基础议题 #### Item 1:指针与引用的区别 - **定义**:指针是一种存储地址的变量,而引用则是某个已存在变量的别名。 - **使用场景**:指针常用于动态内存管理,而引用通常用于传递参数、返回值等。 - **区别**:指针可以被重新指向,而引用则不能改变其所引用的对象。 #### Item 2:尽量使用C++风格的类型转换 - **原因**:传统C风格的类型转换(如(int))可能会导致意外的结果,而C++风格的类型转换(如static_cast<int>)更加安全且易于理解。 - **示例**:使用`static_cast<int>`而不是`(int)`来强制类型转换。 #### Item 3:不要对数组使用多态 - **问题**:当数组作为基类的指针或引用时,使用多态可能导致不正确的类型转换。 - **解决方案**:尽量避免在数组中使用多态,转而使用容器或其他数据结构。 #### Item 4:避免无用的缺省构造函数 - **原因**:缺省构造函数可能导致对象未初始化,从而引发潜在的问题。 - **建议**:明确指定构造函数,确保所有成员都被正确初始化。 ### 运算符 #### Item 5:谨慎定义类型转换函数 - **注意点**:定义类型转换函数时要小心,避免不必要的转换导致的问题。 - **建议**:使用显式的转换操作符,并限制其使用范围。 #### Item 6:自增(INCREMENT)、自减(DECREMENT)操作符前缀形式与后缀形式的区别 - **区别**:前缀形式先执行操作后返回结果,而后缀形式先返回结果后执行操作。 - **应用场景**:选择合适的自增/自减形式可以根据上下文提高代码的可读性和效率。 #### Item 7:不要重载“&&”, “||”, 或“,” - **原因**:这些操作符有特殊的意义和行为,重载它们可能会导致混淆和错误。 - **建议**:避免重载逻辑操作符,除非有非常明确的理由。 #### Item 8:理解各种不同含义的NEW和DELETE - **概念**:`new` 和 `delete` 有不同的形式(如 new/delete 和 new[]/delete[]),适用于不同的场景。 - **使用**:`new[]` 用于创建数组,而 `new` 用于创建单个对象。相应的,`delete[]` 释放数组内存,而 `delete` 释放单个对象的内存。 ### 异常 #### Item 9:使用析构函数防止资源泄漏 - **策略**:在析构函数中释放资源可以有效地防止资源泄漏。 - **示例**:在类的析构函数中释放文件句柄、网络连接等资源。 #### Item 10:在构造函数中防止资源泄漏 - **技术**:使用RAII(Resource Acquisition Is Initialization)技术,即在构造函数中获取资源,在析构函数中释放资源。 - **好处**:保证资源的生命周期管理,避免内存泄漏等问题。 #### Item 11:禁止异常信息(EXCEPTIONS)传递到析构函数外 - **目的**:确保析构函数能够正常执行,避免析构过程中抛出异常。 - **实现**:通过异常安全的设计,确保即使出现异常,析构函数也能正常工作。 #### Item 12:理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异 - **区别**:抛出异常会导致控制流跳转,而传递参数或调用虚函数则按照正常流程执行。 - **注意事项**:在设计程序时需要考虑异常处理的成本及其对性能的影响。 #### Item 13:通过引用(REFERENCE)捕获异常 - **方法**:使用引用捕获异常可以避免不必要的拷贝操作,提高性能。 - **案例**:在捕获异常时使用引用而非值类型。 #### Item 14:审慎使用异常规格(EXCEPTION SPECIFICATIONS) - **建议**:虽然C++标准允许使用异常规格声明函数可能抛出的异常类型,但在实际编程中应该谨慎使用。 - **原因**:异常规格可能导致编译器优化问题,而且在C++11中已被废弃。 #### Item 15:了解异常处理的系统开销 - **成本**:异常处理涉及到栈帧的复制、恢复等操作,可能会导致较大的性能开销。 - **策略**:合理设计程序结构,尽量减少异常的使用,从而降低开销。 ### 效率 #### Item 16:牢记80-20准则(80-20 RULE) - **原则**:20%的代码决定了80%的性能。 - **应用**:集中优化那些关键部分的代码,而不是整体优化。 #### Item 17:考虑使用LAZY EVALUATION(懒惰计算法) - **概念**:只有当结果真正被需要时才进行计算。 - **优势**:可以显著提高程序性能,尤其是在处理大量数据或复杂计算时。 #### Item 18:分期摊还期望的计算 - **思想**:将高成本的操作分摊到多个操作上,以平衡总体性能。 - **案例**:例如,在数据库查询中使用批处理来减少I/O操作。 #### Item 19:理解临时对象的来源 - **来源**:临时对象通常由函数返回值、表达式求值等产生。 - **优化**:使用右值引用等技术来减少临时对象的数量,提高性能。 #### Item 20:协助完成返回值优化 - **方法**:利用编译器的自动优化机制,减少不必要的对象复制。 - **示例**:使用std::move()来转移对象的所有权,减少复制。 #### Item 21:通过重载避免隐式类型转换 - **策略**:通过重载运算符或函数,显式控制类型转换过程。 - **好处**:提高代码的可读性和安全性。 #### Item 22:考虑用运算符的赋值形式(OP=)取代其单独形式(OP) - **改进**:使用赋值形式的运算符(如operator+=)可以减少对象复制,提高效率。 - **示例**:使用`a += b`代替`a = a + b`。 #### Item 23:考虑变更程序库 - **背景**:有时候使用更高效的库可以显著提高程序性能。 - **案例**:例如,使用STL替代手写的数据结构。 #### Item 24:理解虚拟函数、多继承、虚基类和RTTI所需的代价 - **代价**:这些特性增加了额外的运行时开销,包括虚函数表查找、虚基类的间接寻址等。 - **优化**:合理设计类结构,减少不必要的多继承和虚基类使用,优化RTTI(Run-Time Type Information)的使用。 ### 技巧(TECHNIQUES,又称IDIOMS或PATTERN) #### Item 25:将构造函数和非成员函数虚拟化 - **目的**:允许通过基类指针调用派生类的构造函数。 - **案例**:在工厂模式中,通过基类指针创建派生类实例。 #### Item 26:限制某个类所能产生的对象数量 - **方法**:通过静态成员变量或单例模式等技术实现。 - **案例**:例如,在线程池中限制活动线程的数量。 #### Item 27:要求或禁止在堆中产生对象 - **策略**:通过构造函数和析构函数的访问控制来实现。 - **示例**:禁止在堆中创建对象可以通过将构造函数设置为私有并提供一个工厂函数来实现。 #### Item 28:灵巧(SMART)指针 - **概念**:使用智能指针管理动态分配的对象的生命周期。 - **类型**:包括std::unique_ptr、std::shared_ptr等。 - **优点**:自动管理内存,避免内存泄漏和悬挂指针。 #### Item 29:引用计数 - **原理**:跟踪共享资源的使用情况,当引用计数为零时自动释放资源。 - **实现**:通常通过智能指针实现。 #### Item 30:代理类 - **目的**:为另一个对象提供一个代理或占位符。 - **案例**:例如,在图形渲染中使用代理对象来延迟加载纹理。 #### Item 31:让函数根据一个以上的对象来决定怎么虚拟 - **技术**:通过模板和多态相结合来实现。 - **案例**:例如,设计一个可以处理不同类型对象的通用算法。 ### 杂项 #### Item 32:在未来时态下开发程序 - **概念**:考虑未来的需求变化,编写可扩展和可维护的代码。 - **策略**:采用模块化设计,预留接口和扩展点。 #### Item 33:将非尾端类设计为抽象类 - **目的**:防止用户误用此类作为最终产品。 - **案例**:例如,将基类设计为抽象类,要求用户必须通过派生类来使用。 #### Item 34:如何在同一程序中混合使用C++和C - **技术**:使用extern "C"声明C函数。 - **案例**:在C++程序中调用C库函数。 #### Item 35:让自己习惯使用标准C++语言 - **建议**:熟悉和掌握C++标准库,如STL、Boost等。 - **优势**:提高编程效率,增强代码的可读性和可维护性。 通过以上详细的知识点介绍,《More Effective C++》不仅涵盖了C++的基础概念,还深入探讨了高级主题,旨在帮助程序员提高编程技巧,编写出更加高效、健壮的代码。
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/release/download_crawler_static/2700840/bg1.jpg)
![](https://csdnimg.cn/release/download_crawler_static/2700840/bg2.jpg)
![](https://csdnimg.cn/release/download_crawler_static/2700840/bg3.jpg)
![](https://csdnimg.cn/release/download_crawler_static/2700840/bg4.jpg)
![](https://csdnimg.cn/release/download_crawler_static/2700840/bg5.jpg)
剩余263页未读,继续阅读
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 0
- 资源: 7
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)