第1章 C++基础 1
1.1 C++概述 2
1.1.1 程序 2
1.1.2 预处理指令 3
1.1.3 输入与输出 4
1.1.4 C++编程思想 6
1.1.5 基于对象的程序设计 6
1.1.6 面向对象的程序设计 7
1.2 控制语句 9
1.2.1 分支 9
1.2.2 循环 12
1.2.3 跳转 14
1.3 数据类型 15
1.3.1 基本数据类型 15
1.3.2 文字量 17
1.3.3 枚举 19
1.3.4 结构体 20
1.3.5 共用体 22
1.4 指针和数组 23
1.4.1 内存开辟 23
1.4.2 void指针 25
1.4.3 空指针 26
1.4.4 多级指针 26
1.4.5 指针数组 28
1.4.6 数组指针 28
1.5 函数 29
1.5.1 传值与传引用 29
1.5.2 传指针与传数组 30
1.5.3 默认和可变参数 31
1.5.4 返回值 33
1.5.5 函数和指针 33
1.6 思考与练习 35
第2章 认识类 36
2.1 类的来源 37
2.2 类有哪些成员 38
2.3 类可以出现的位置 42
2.4 类的极限形式 45
2.5 类和结构体的区别 53
2.6 类型的演进 54
2.7 类的路线图 54
2.8 思考与练习 57
第3章 认识类的思想 58
3.1 类的封装性 58
3.2 类的继承性 61
3.3 类的多态性 64
3.3.1 编译时多态性 64
3.3.2 运行时多态性 67
3.4 思考与练习 68
第4章 对象 69
4.1 构造函数 70
4.1.1 重载构造函数 75
4.1.2 默认构造函数 75
4.1.3 复制构造函数 78
4.1.4 转化构造函数 80
4.1.5 显式构造函数 82
4.1.6 区分构造形式 83
4.2 析构函数 85
4.3 静态成员 88
4.3.1 静态成员函数 88
4.3.2 静态数据成员 92
4.4 常量成员 100
4.4.1 常量成员函数 100
4.4.2 常量数据成员 100
4.4.3 常量和非常量的区别 101
4.5 静态与常量成员 102
4.6 内联函数和友元函数 103
4.6.1 内联函数 103
4.6.2 友元函数与友元类 106
4.7 对象数组 109
4.8 创建特殊对象 111
4.9 思考与练习 113
第5章 运算符重载 114
5.1 可重载的运算符 115
5.2 重载的原则 115
5.3 定义新运算符 116
5.4 运算符的原有语义 117
5.5 对象或全局函数 120
5.6 运算符的参数 123
5.7 独立和复合运算符 126
5.8 赋值运算符不参与继承 126
5.9 重载运算符的限定 128
5.10 改变运算符的可见性 130
5.11 相等 132
5.12 赋值 134
5.13 下标 136
5.14 函数调用 138
5.15 类型转化 141
5.16 增量和减量 142
5.17 分配和释放 144
5.18 思考与练习 146
第6章 完整的String类 147
6.1 引言 148
6.2 确定目标 148
6.3 设计接口 148
6.4 定义接口 149
6.5 字符串的创建 151
6.6 字符串的销毁 155
6.7 字符串与字符数组 155
6.8 安全数据 156
6.9 赋值、下标和其他 157
6.10 算法 158
6.11 提取 161
6.12 大小和容量 164
6.13 比较 164
6.14 输入和输出 166
6.15 异常处理 166
6.16 简单的应用 167
6.17 思考与练习 169
第7章 继承 170
7.1 可能的继承方式 171
7.2 看待各种继承 173
7.3 类和结构体彼此继承 173
7.4 认识虚拟继承 175
7.5 使用空类型 177
7.6 “共同”的使用 179
7.7 继承中的构造和析构 181
7.7.1 构造函数的调用顺序 181
7.7.2 析构函数的调用顺序 185
7.7.3 虚拟继承对象的构造 185
7.8 思考与练习 186
第8章 内存布局 187
8.1 要解决的问题 188
8.2 内存有哪些成员 188
8.3 各种内存布局 190
8.3.1 独立类型 190
8.3.2 单继承 192
8.3.3 多继承 193
8.3.4 有共同基类的继承 195
8.3.5 虚拟继承 197
8.3.6 虚函数表指针的存储 200
8.4 基类的连续性 202
8.5 空类的大小 203
8.6 内存的膨胀 203
8.7 思考与练习 206
第9章 类型转化 208
9.1 对象类型向上转化 209
9.1.1 单继承与多继承 209
9.1.2 有共同基类的继承 210
9.2 对象类型向下转化 211
9.2.1 单继承 211
9.2.2 多继承 212
9.2.3 有共同基类的继承 214
9.3 指针类型转化 215
9.4 指针类型向上转化 216
9.4.1 单继承与多继承 216
9.4.2 有共同基类的继承 217
9.5 指针类型向下转化 218
9.5.1 单继承 218
9.5.2 多继承 220
9.5.3 有共同基类的继承 221
9.6 思考与练习 222
第10章 虚拟机制 224
10.1 虚函数的声明 225
10.2 虚函数的调用 225
10.3 抽象类 227
10.3.1 抽象类的数据成员 228
10.3.2 抽象类的局部派生 229
10.3.3 抽象类作为派生类 229
10.4 虚析构函数 230
10.5 虚函数与虚拟继承 231
10.6 虚函数表指针与类型 232
10.7 虚函数表项未必相同 232
10.8 思考与练习 233
第11章 完整的MiniDataSet类层次结构 235
11.1 引言 236
11.2 确定目标 236
11.3 继承与组合 238
11.4 继承类型和数据封装 240
11.5 层次结构图 242
11.6 定义接口 243
11.7 实现接口 249
11.7.1 BaseData接口 249
11.7.2 KeyData接口 249
11.7.3 ValueData接口 250
11.7.4 DicEle接口 251
11.7.5 Dictionary接口 253
11.7.6 NamedDic接口 256
11.7.7 NamedDicSet接口 256
11.7.8 MiniHeader接口 260
11.7.9 MiniTable接口 261
11.8 包容性扩展 262
11.9 简单的应用 263
11.10 思考与练习 266
第12章 综合设计与实现 267
12.1 逐步求精类型的设计 268
12.1.1 设计需求 268
12.1.2 基本表示 268
12.1.3 存储结构化 271
12.1.4 改善内部表示 273
12.1.5 拓展类型的能力 282
12.1.6 设计总结 285
12.2 受限制类型的设计 285
12.2.1 设计需求 286
12.2.2 限制函数的返回 286
12.2.3 限制函数的参数 287
12.2.4 设计总结 289
12.3 扩展容器类型的设计 290
12.3.1 设计需求 290
12.3.2 一对多的映射 290
12.3.3 多对多的映射 291
12.3.4 设计总结 293
12.4 函数组类型的设计 293
12.4.1 设计需求 293
12.4.2 构造式设计 293
12.4.3 运算符式设计 298
12.4.4 设计总结 300
12.5 跳跃数组类型的设计 300
12.5.1 设计需求 300
12.5.2 元素类型的设计 301
12.5.3 包含类型的实现 305
12.5.4 扩展包含类型的接口 307
12.5.5 增强包含类型的存储 309
12.5.6 设计总结 312
12.6 可替换类型的设计 312
12.6.1 设计需求 312
12.6.2 替换分隔式数组 313
12.6.3 替换仅含数据的结构体 316
12.6.4 替换类对象数组 318
12.6.5 替换函数指针数组 319
12.6.6 设计总结 321
12.7 统一输入输出类型的设计 321
12.7.1 设计需求 321
12.7.2 输出的原子动作 321
12.7.3 统一的文件输出 324
12.7.4 统一的网络输出 325
12.7.5 统一的数据输出 327
12.7.6 设计总结 329
12.8 思考与练习 329
附录 常用英文术语 330
参考文献 331