前言 1
第一章 软件危机 2
1.1 库的失败 2
1.2 面向对象方法 3
1.3 为可再用而设计 4
1.4 练习 5
第二章 C++导论 6
2.1 参量原型 6
2.2 类型安全连接 7
2.3 函数重载 7
2.4 引用 8
2.5 类 9
2.6 常量成员函数 11
2.7 运算符重载 11
2.8 构造函数 15
2.9 析构函数 16
2.10 继承 17
2.11 练习 17
第三章 一个扩充比较 19
3.1 TextLine:C版本 19
3.2 TextLine:C++版本 20
3.3 TextLine的最后一个回合 23
3.4 练习 25
第四章 类的设计 26
4.1 抽象数据类型 26
4.1.1 表示矩形 26
4.1.2 矩形:抽象数据类型 28
4.1.3 组合表示和抽象数据类型 28
4.1.4 优点是什么? 29
4.2 存取函数和变换函数 29
4.2.1 变换函数 31
4.2.2 何时成为公共的 32
4.3 练习 33
5.1 特殊化:正方形类 34
第五章 继承 34
5.1.1 原来设计中的缺陷 35
5.2 因子化:GeomObject类 36
5.2.1 使用公共基类 36
5.2.2 实现包围边框测试 37
5.2.3 矩形的新版本 38
5.3 虚拟函数 39
5.4 练习 40
第六章 综合 41
变换函数的一个技巧 42
6.1 点算术 44
6.2 析构点算法 45
6.3 转到三维 46
6.4 练习 47
7.1 抽象位集 48
第七章 位集 48
7.2 基本实现 49
7.3 通用位集 51
7.4 处理编译程序头脑死亡 53
7.5 练习 55
第八章 表 56
8.1 表的基础 56
8.1.1 表的元素 56
8.1.2 表头 58
8.2 类型检查的问题 60
8.3 关于虚拟函数的实现注释 61
8.4 练习 62
第九章 数组 63
9.1 一个数组类 63
9.1.1 TArray和实际数组之间的区别 64
9.1.2 性能 65
9.2 有界数组类 66
9.2.1 性能 67
9.3 改进TArray的设计 67
9.3.1 重复设计十分重要 68
9.4 练习 69
第十章 动态数组 71
10.1 TDynamicArray::grow()的问题 72
10.2 通用数组 74
10.2.1 调试通用类 76
10.3 使BoundedArray通用 76
10.4 练习 77
第十一章 二叉树 78
11.1 实现二叉树 78
11.1.1 不太直接是件好事 80
11.2 使BinaryTree通用 82
11.3 处理昂贵的比较 84
11.4 练习 85
第十二章 哈希表 86
12.1 哈希表的基础 86
12.1.1 哈希表中有什么? 87
12.1.2 多少个bucket? 88
12.1.3 选择哈希函数 88
12.2 实现接口 89
12.3 扩展接口 91
12.4 通用哈希表 93
12.4.1 建立HashTable 94
12.5 练习 95
第十三章 指针类 96
13.1 基本版本 96
13.2 运算符++的问题 98
13.3 分配和释放 99
13.4 通用指针 100
13.5 引用计数 101
13.4.1 有关设计的观点 101
13.5.1 使用RPtr通用 103
13.6 练习 105
第十四章 原子 106
14.1 限制 106
14.1.1 构造 107
14.1.2 插入 108
14.2 实现的不足 109
14.1.3 查找原子 109
14.2.1 建立哈希算法 111
14.3 练习 112
第十五章 内存管理 113
15.1 传统的内存管理 113
15.2 C++的解决方法:运算符new()和delete() 114
15.2.1 当对象被再用时 115
15.2.2 强迫的构造和析构 116
16.1.1 明显的情况 117
第十六章 调整性能 117
16.1 使用inline 117
16.1.2 条件执行 118
16.1.3 循环 118
16.1.4 其他情况 118
16.2 寄存器分配 118
16.2.1 有多少个寄存器? 119
16.2.2 重要变量 119
16.2.3 有效地使用作用域 119
16.2.4 小结 120
16.3 按引用传递 121
第十七章 模板 122
17.1 模板 122
17.2 对变量和常量的参数化 124
17.3 用模板建立数组类 125
附录 完整的类 128