Effective C++ (3rd) 学习笔记
吴金龙
北京大学数学科学学院
2008年12月
2
目录
第第第一一一章章章 让让让自自自己己己习习习惯惯惯C++ 1
1.1 条款01:视C++为一个语言联邦 . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 条款02:尽量以const,enum,inline替换#define . . . . . . . . . . . . . . . . . 1
1.3 条款03:尽可能使用const . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.4 条款04:确定对象被使用前已先被初始化 . . . . . . . . . . . . . . . . . . . . 3
第第第二二二章章章 构构构造造造/析析析构构构/赋赋赋值值值运运运算算算 5
2.1 条款05:了解C++ 默默编写并调用哪些函数 . . . . . . . . . . . . . . . . . . 5
2.2 条款06:若不想使用编译器自动生成的函数,
就该明确拒绝 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 条款07:为多态基类声明virtual析构函数 . . . . . . . . . . . . . . . . . . . . 6
2.4 条款08:别让异常逃离析构函数 . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.5 条款09:绝不在构造和析构过程中调用virtual函数 . . . . . . . . . . . . . . . 7
2.6 条款10:令operator=返回一个reference to *this . . . . . . . . . . . . . . . . 7
2.7 条款11:在operator=中处理“自我赋值” . . . . . . . . . . . . . . . . . . . . 8
2.8 条款12:复制对象时勿忘其每一个成分 . . . . . . . . . . . . . . . . . . . . . 10
第第第三三三章章章 资资资源源源管管管理理理 11
3.1 条款16:成对使用new和delete时要采取相同形式 . . . . . . . . . . . . . . . . 11
第第第四四四章章章 设设设计计计与与与声声声明明明 13
4.1 条款19:设计class犹如设计type . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2 条款20:宁以pass-by-reference-to-const替换pass-by-value . . . . . . . . . . . 13
第第第五五五章章章 实实实现现现 15
5.1 条款26:尽可能延后变量定义式的出现时间 . . . . . . . . . . . . . . . . . . 15
5.2 条款28:避免返回handles指向对象内部成分 . . . . . . . . . . . . . . . . . . 16
5.3 条款30:透彻了解inlining的里里外外 . . . . . . . . . . . . . . . . . . . . . . 16
i
ii
目录
第第第六六六章章章 继继继承承承与与与面面面向向向对对对象象象设设设计计计 19
6.1 条款33:避免遮掩继承而来的名称 . . . . . . . . . . . . . . . . . . . . . . . . 19
6.2 条款36:绝不重新定义继承而来的non-virtual 函数 . . . . . . . . . . . . . . 21
6.3 条款37:绝不重新定义继承而来的缺省参数值 . . . . . . . . . . . . . . . . . 22
6.4 条款38:通过复合塑模出has-a 或“根据某物实现出” . . . . . . . . . . . . . 23
6.5 条款40:明智而审慎地使用多重继承 . . . . . . . . . . . . . . . . . . . . . . 23
第第第七七七章章章 模模模版版版和和和泛泛泛型型型编编编程程程 25
7.1 条款42:了解typename的双重意义 . . . . . . . . . . . . . . . . . . . . . . . 25
7.2 条款44:将与参数无关的代码抽离templates . . . . . . . . . . . . . . . . . . 26
第一章 让自己习惯C++
1.1 条款01:视C++为一个语言联邦
今天的C++已经是个多重范型编程语言(multiparadigm programming language),一
个同时支持过程形式(procedural)、面向对象形式(object-oriented)、函数形式(functional)、
泛型形式(generic)、元编程形式(metaprogramming)的语言。
最简单的方法是将C++视为一个由相关次语言(sublanguage)组成的联邦而非单一
语言。幸运的是,次语言总共有四个:
• C。
• Object-Oriented C++。包括:class(包括构造函数和析构函数)、封装(encapsulation)、
继承(inheritance)、多态(polymorphism)、virtual 函数(动态绑定)、... ... 等等。
• Template C++。这是C++ 的泛型编程(generic programming)部分。
• STL。STL 是个template 程序库,但它是非常特殊的一个。它对容器(containers)、
迭代器(iterators)、算法(algorithms)以及函数对象(function objects)的规约有极
佳的紧密配合与协调,然而templates 及程序库也可以其他想法建置出来。
1.2 条款02:尽量以const,enum,inline替换#define
这个条款或许可以改为“宁可用编译器替换预处理器”。
通常C++要求你对所使用的任何东西提供一个定义式,但如果它是个class专属常量
又是static且为整数类型(integral type,例如int,char,b ool),则可特殊处理。只要不取它们
的地址,你可以声明并使用它们而无需提供定义式。
例例例:
class GamePlayer{
private:
static const int NumTurns = 5 ; //常量声明式
int scores[NumTurns] ; //使用该常量
...
} ;
1