第1章 抽象 1
1.1有关电话号码的抽象模型 3
1.2抽象模型间的关系 5
1.3请考虑边界条件 10
1.4使用CRC卡片来辅助设计 10
1.5小结 11
1.6问题 11
第2章类 13
2.1构造函数 13
2.2赋值 21
2.3公用数据 23
2.4隐式类型转换 27
2.5操作符重载:成员或非成员 33
2.6重载、缺省值以及省略符 35
2.7 Const 37
2.8返回值为引用 44
2.9静态对象的构造 44
2.10小结 46
2.11问题 46
第3章 句柄 49
3.1一个String类 49
3.2使用计数器来避免多份拷贝 51
3.3避免进行重编译:Cheshire Cat 56
3.4使用句柄来隐藏设计 58
3.5多种实现 59
3.6作为对象的句柄 63
3.7综述 63
3.8小结 63
3.9问题 64
第4章 继承 67
4.1 is-a关系 67
4.2公有继承 72
4.3私有继承 73
4.4保护型继承 75
4.5与基类抽象的一致性 75
4.6纯虚函数 78
4.7有关继承的细节和陷阱 80
4.8小结 83
4.9问题 84
第5章 多重继承 85
5.1作为交集的多重继承 85
5.2虚基类 89
5.3一些有关多重继承的细节问题 93
5.4小结 95
5.5问题 95
第6章 考虑继承的设计 97
6.1被保护的接口 97
6.2我们的设计是否应该考虑到继承? 101
6.3一些为继承所做的设计的例子 105
6.4结论 111
6.5小结 111
6.6问题 111
第7章 模板 113
7.1模板类Pair 115
7.2一些有关模板的细节 117
7.3模板的实例化 118
7.4智能指针 120
7.5作为模板参数的表达式 126
7.6模板函数 128
7.7小结 131
7.8问题 132
第8章 模板的高级用法 135
8.1使用了模板的容器类 135
8.2示例:Block 137
8.3有关Block的设计细节 140
8.4带有迭代器的容器:List 144
8.5迭代器的设计细节 151
8.6性能上的考虑 154
8.7对模板参数的限制 157
8.8模板特化 159
8.9小结 165
8.10问题 166
第9章 重用 169
9.1发现和获得 170
9.2健壮性 171
9.3内存管理 177
9.4可选的内存分配方案 179
9.5传递参数给operator new 183
9.6管理外部资源 185
9.7寻找有关内存的bug 185
9.8名字冲突 190
9.9性能 194
9.10不要去猜想,而应该度量! 194
9.11算法 195
9.12动态内存分配中的瓶颈 196
9.13内嵌 201
9.14 Tiemann法则 203
9.15小结 204
9.16问题 205
第10章 异常 207
10.1一个负面的声明 207
10.2为什么需要异常? 209
10.3一个异常的例子 210
10.4异常只应该用来表述异常情况 211
10.5理解异常 213
10.6责任评估 213
10.7设计异常对象 215
10.8小结 218
10.9问题 218
第11章向C++移植 221
11.1选择使用C 221
11.2采用C 223
11.3设计和实现 224
11.4开发一个坚实的基础 227
11.5相关的思考 227
11.6小结 227
11.7问题 228