目录 1
代译者序 1
序 1
第0章 简介 1
0.1 关于示例代码 1
0.2 本书的组织 2
0.3 问题 2
0.4 语言规则 3
第1章 抽象 4
1.1 有关电话号码的抽象模型 6
1.2 抽象模型间的关系 7
1.3 请考虑边界条件 12
1.5 小结 13
1.4 使用CRC卡片来辅助设计 13
1.6 问题 14
第2章 类 15
2.1 构造函数 15
2.2 赋值 23
2.3 公用数据 24
2.4 隐式类型转换 28
2.5 操作符重载:成员或非成员? 33
2.6 重载、缺省值以及省略符 36
2.7 Const 37
2.8 返回值为引用 43
2.9 静态对象的构造 44
2.10 小结 45
2.11 问题 46
3.1 一个String类 48
第3章 句柄 48
3.2 使用计数器来避免多份拷贝 50
3.3 避免进行重编译:Cheshire Cat 55
3.4 使用句柄来隐藏设计 56
3.5 多种实现 57
3.6 作为对象的句柄 61
3.7 综述 61
3.8 小结 61
3.9 问题 61
第4章 继承 63
4.1 is-a关系 63
4.2 公有继承 68
4.3 私有继承 68
4.4 保护型继承 70
4.5 与基类抽象的一致性 71
4.6 纯虚函数 73
4.7 有关继承的细节和陷阱 75
4.8 小结 78
4.9 问题 79
第5章 多重继承 80
5.1 作为交集的多重继承 80
5.2 虚基类 85
5.3 一些有关多重继承的细节问题 89
5.4 小结 91
5.5 问题 91
第6章 考虑继承的设计 93
6.1 被保护的接口 93
6.2 我们的设计是否应该考虑到继承? 96
6.3 一些为继承所做的设计的例子 100
6.5 小结 105
6.4 结论 105
6.6 问题 106
第7章 模板 107
7.1 模板类Pair 109
7.2 一些有关模板的细节 110
7.3 模板的实例化 111
7.4 智能指针 113
7.5 作为模板参数的表达式 119
7.6 模板函数 121
7.7 小结 124
7.8 问题 124
第8章 模板的高级用法 126
8.1 使用了模板的容器类 126
8.2 示例:Block 127
8.3 有关Block的设计细节 130
8.4 带有迭代器的容器:List 134
8.5 迭代器的设计细节 141
8.6 性能上的考虑 144
8.7 对模板参数的限制 146
8.8 模板特化 148
8.9 小结 154
8.10 问题 154
第9章 重用 156
9.1 发现和获得 157
9.2 健壮性 158
9.3 内存管理 163
9.4 可选的内存分配方案 165
9.5 传递参数给operator new 168
9.6 管理外部资源 170
9.7 寻找有关内存的bug 171
9.8 名字冲突 175
9.9 性能 178
9.10 不要去猜想,而应该度量! 179
9.11 算法 179
9.12 动态内存分配中的瓶颈 180
9.13 内嵌 185
9.14 Tiemann法则 187
9.15 小结 187
9.16 问题 188
第10章 异常 190
10.1 一个负面的声明 190
10.3 一个异常的例子 192
10.2 为什么需要异常? 192
10.4 异常只应该用来表述异常情况 194
10.5 理解异常 195
10.6 责任评估 196
10.7 设计异常对象 197
10.8 小结 200
10.9 问题 200
第11章 向C++移植 202
11.1 选择使用C++ 202
11.2 采用C++ 203
11.3 设计和实现 204
11.4 开发一个坚实的基础 206
11.5 相关的思考 207
11.6 小结 207
11.7 问题 208