《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 1Accustoming Yourself to C++(熟悉C++)Item 1-4
Chapter 2Constructors, Destructors, and Assignment Operators(构造/析构/赋值)Item 5-12
Chapter 3Resource Management(资源管理)Item 13-17
Chapter 4Designs and Declarations(设计与声明)Item 18-25
Chapter 5Implementations(实现)Item 26-31
Chapter 6Inheritance 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起纳入标准)

与其他书籍的关系


实际价值

本书的55条建议每一条都基于作者多年的C++编程实践经验,涵盖了从基础语法到高级特性的各个方面。阅读本书后,程序员可以:

  1. 避免常见的C++陷阱和未定义行为
  2. 编写更安全、更高效的代码
  3. 理解C++的设计哲学和最佳实践
  4. 为后续学习模板元编程、STL深入使用打下基础

处理备注

  • 本书为mixed类型PDF(混合文本与扫描页)
  • 使用pdf-inspector文本提取成功,共321页,666,642字符
  • 原文件路径:/books/c++/effective c++/Addison.Wesley.Effective.CPP.3rd.Edition.May.2005.pdf