《Effective C++》- 55个改善程序与设计的具体做法
作者: Scott Meyers
出版社: Addison-Wesley Professional Computing Series
年份: 2005 (Third Edition)
ISBN: 0-321-33487-6
页数: 321页
文件大小: 6.38MB
核心概述
《Effective C++》是C++编程领域最具影响力的经典著作之一,被誉为”C++程序员的第二本书”。Scott Meyers以55条精心设计的”条款”(Item)形式,系统阐述了如何编写高效、安全、可维护的C++代码。
该书与《More Effective C++》、《Effective STL》构成Scott Meyers的”Effective三剑客”,是C++程序员从入门到精通的必读经典。
书籍结构
全书分为6章,共55条建议:
| 章节 | 主题 | 条款数 |
|---|---|---|
| Chapter 1 | Accustoming Yourself to C++(熟悉C++) | Item 1-4 |
| Chapter 2 | Constructors, Destructors, and Assignment Operators(构造/析构/赋值) | Item 5-12 |
| Chapter 3 | Resource Management(资源管理) | Item 13-17 |
| Chapter 4 | Designs and Declarations(设计与声明) | Item 18-25 |
| Chapter 5 | Implementations(实现) | Item 26-31 |
| Chapter 6 | Inheritance and Object-Oriented Design(继承与面向对象设计) | Item 32-55 |
核心内容
第一章:熟悉C++
- Item 1: 将C++视为一个语言联邦(federation of languages)——C++由C、Object-Oriented C++、Template C++、STL四个子语言组成,理解这点至关重要
- Item 2: 优先使用const、enum、inline代替#define(预处理指令缺乏类型安全)
- Item 3: 尽可能使用const——const是类型系统的一部分,而非预处理符号
- Item 4: 确保对象在使用前已被初始化(C++对”未初始化”无定义行为)
第二章:构造/析构/赋值
- Item 5: 了解C++默认生成并调用的函数(构造函数、拷贝构造函数、赋值运算符、析构函数)
- Item 6: 显式禁止不想要的编译器生成函数(通过声明为private)
- Item 7: 在多态基类中声明虚析构函数
- Item 8: 析构函数中不要抛出异常
- Item 9: 构造和析构过程中不要调用虚函数
- Item 10: 赋值运算符返回
*this的引用 - Item 11: 在
operator=中处理自赋值 - Item 12: 复制对象的所有部分(包括基类部分)
第三章:资源管理
- Item 13: 用对象管理资源(RAII原则)——资源获取即初始化
- Item 14: 在资源管理类中考虑拷贝行为(深拷贝/浅拷贝/转移所有)
- Item 15: 在资源管理类中提供对原始资源的访问
- Item 16: 成对使用new和delete时要采用相同形式
- Item 17: 将newed对象存入智能指针(
std::auto_ptr、tr1::shared_ptr)
第四章:设计与声明
- Item 18: 让接口容易被正确使用,不易被误用(促进正确用法,阻止错误用法)
- Item 19: 将类设计为类型设计(Type Design)
- Item 20: 优先使用pass-by-reference-to-const而非pass-by-value
- Item 21: 必须返回对象时不要试图返回引用
- Item 22: 将数据成员声明为private
- Item 23: 优先使用非成员非友元函数而非成员函数
- Item 24: 当类型转换应应用于所有参数时,声明非成员函数
- Item 25: 考虑支持不抛异常的swap
第五章:实现
- Item 26: 尽可能延后变量定义的出现
- Item 27: 尽量少做转型(Cast)
- Item 28: 避免返回”句柄”指向对象内部
- Item 29: 追求异常安全的代码(强保证、基本保证、nothrow保证)
- Item 30: 透彻理解inline的来龙去脉
- Item 31: 最小化编译依赖关系
第六章:继承与面向对象设计
- Item 32: 确保public继承模拟”is-a”关系
- Item 33: 避免隐藏继承而来的名称
- Item 34: 区分继承接口与继承实现
- Item 37: 绝不重新定义继承而来的缺省参数值
- Item 38: 用”has-a”或”is-implemented-in-terms-of”建模复合
- Item 39: 谨慎使用私有继承
- Item 40: 谨慎使用多重继承
- Item 41: 理解隐式接口与编译期多态
- Item 42: 理解typename的双重含义
- Item 43: 访问模板化基类中的名称
- Item 44: 将参数无关的代码从模板中分离
- Item 45: 使用成员函数模板接受所有兼容类型
- Item 46: 非成员函数配合模板时考虑类型转换
- Item 47: 使用traits类获取类型信息
- Item 48: 警惕模板元编程
- Item 49: 理解new-handler的行为
- Item 50: 理解何时应该替换new和delete
- Item 51: 编写new和delete时遵守惯例
- Item 52: 如果写了placement new,也要写placement delete
- Item 53: 重视编译器警告
- Item 54: 熟悉标准库
- Item 55: 熟悉Boost
关键概念
RAII(Resource Acquisition Is Initialization)
资源获取即初始化,是C++资源管理的核心范式。通过将资源生命周期绑定到对象生命周期,确保异常安全。
const正确性
const不仅是修饰符,更是类型系统的一部分。正确使用const可以提高代码安全性并表达设计意图。
异常安全
三种级别的异常安全保证:
- nothrow保证:绝不会抛出异常
- 基本保证:资源不泄漏,对象保持有效状态
- 强保证:操作要么完全成功,要么完全失败(事务性)
NVI(Non-Virtual Interface)惯用法
通过public非虚函数调用private虚函数,既保持接口稳定又允许子类重写行为。
智能指针
std::auto_ptr:所有权转移的自动指针(C++98)tr1::shared_ptr:引用计数的智能指针(C++11起纳入标准)
与其他书籍的关系
- 前置阅读: 《C++ Primer》、《C++编程语言》——需要了解C++基础语法
- 后续阅读: 《More Effective C++》(35条进阶建议)、《Effective STL》(50条STL使用建议)
- 关联书籍: 《Modern C++ Design》(策略模式与泛型编程)
实际价值
本书的55条建议每一条都基于作者多年的C++编程实践经验,涵盖了从基础语法到高级特性的各个方面。阅读本书后,程序员可以:
- 避免常见的C++陷阱和未定义行为
- 编写更安全、更高效的代码
- 理解C++的设计哲学和最佳实践
- 为后续学习模板元编程、STL深入使用打下基础
处理备注
- 本书为mixed类型PDF(混合文本与扫描页)
- 使用pdf-inspector文本提取成功,共321页,666,642字符
- 原文件路径:
/books/c++/effective c++/Addison.Wesley.Effective.CPP.3rd.Edition.May.2005.pdf