第1篇 面向对象奠基 3
第1单元 对象世界及其建模 3
1.1程序=模型+表现 3
1.1.1程序的概念 3
1.1.2模型 3
1.1.3模型表现工具 5
1.2面向对象程序设计的基本概念 8
1.2.1对象与类 8
1.2.2类的层次性 9
1.2.3消息传递 10
1.3 UML建模 10
1.3.1用例图 11
1.3.2序列图 11
1.3.3状态图 11
1.3.4类图与类间关系 12
1.3.5对象图 13
1.3.6类间联系的UML表示 13
习题1 15
第2单元 学生类 17
2.1类Student的声明 17
2.1.1类静态属性的C++++描述 17
2.1.2类行为的C++++描述 19
2.1.3类成员的访问控制 20
2.1.4类Student声明的完整形式 20
2.2类Student的实现 22
2.2.1函数定义概述 22
2.2.2成员函数setStud()的定义 22
2.2.3成员函数dispStud()的定义 23
2.3类的测试与主函数 24
2.3.1类测试的概念 24
2.3.2对象的生成及其成员的访问 25
2.3.3主函数 25
2.4用构造函数初始化对象 27
2.4.1构造函数的初始化机制 27
2.4.2部分初始化构造函数、无参构造函数与构造函数重载 29
2.4.3默认构造函数 30
2.4.4析构函数 30
2.5语法知识扩展1 31
2.5.1 C++++程序的组成 31
2.5.2类与对象 31
2.5.3 C++++单词 32
2.5.4数据类型初步 33
2.5.5变量与常量 35
习题2 36
第3单元 呼叫器 40
3.1呼叫器建模与类声明 40
3.1.1问题与建模 40
3.1.2呼叫器类声明的C ++++描述 41
3.2呼叫器类的实现 41
3.2.1用if-else结构定义display() 42
3.2.2用switch结构定义display() 45
3.2.3 if-else判断结构与switch判断结构比较 47
3.3选择结构的测试 47
3.3.1逻辑覆盖测试及其策略 47
3.3.2测试用例的使用 51
3.3.3呼叫器类测试 51
3.4用静态成员变量存储类对象的共享常量——呼叫器类的改进 53
3.4.1自动变量与静态变量:不同生命期的变量 53
3.4.2使用静态成员变量的呼叫器类及其测试 54
3.4.3静态成员变量的特点 56
3.5王婆卖瓜——静态成员变量作为类对象的共享成员的另一例 56
3.5.1问题与模型 56
3.5.2 WangPo类声明与实现 57
3.5.3 WangPo类的测试 57
3.5.4 WangPo类的改进 58
习题3 60
第4单元 累加器 64
4.1累加器类结构设计与类声明 64
4.1.1累加器类结构设计 64
4.1.2累加器类声明 64
4.2累加器类的实现 65
4.2.1构造函数的实现 65
4.2.2成员函数calc()的定义与while语句 66
4.2.3使用do-while结构的calc()函数 67
4.2.4使用for结构的calc()函数 68
4.2.5三种循环流程控制结构的比较 68
4.3循环结构的测试 68
4.3.1等价分类法与边值分析法 68
4.3.2循环结构的测试用例设计 70
4.3.3累加器类的测试 70
4.3.4变量(对象)的作用域问题 71
4.4语法知识扩展2 71
4.4.1 C++++语句 71
4.4.2函数 72
4.4.3对象的存储 73
习题4 74
第5单元 简单的公司人员体系 77
5.1公司人员的类层次结构 77
5.1.1问题建模 77
5.1.2类层次结构声明 77
5.1.3在派生类中重定义基类成员函数 80
5.1.4类层次结构中成员函数执行规则 82
5.1.5基于血缘关系的访问控制——protected 85
5.2指针与引用 85
5.2.1指针=基类型+地址 85
5.2.2指向对象的指针与this 88
5.2.3引用 89
5.3类层次中的赋值兼容规则与里氏代换原则 91
5.3.1类层次中的赋值兼容规则 91
5.3.2里氏代换原则 92
5.4虚函数与抽象类 93
5.4.1动态绑定与虚函数 93
5.4.2虚函数表 94
5.4.3虚函数规则与虚析构函数 95
5.4.4纯虚函数与抽象类 96
5.4.5虚函数在面向对象程序设计中的意义 98
5.5多基派生与虚拟派生 98
5.5.1多基派生 98
5.5.2多基派生的歧义性问题 101
5.5.3虚拟派生 102
习题5 103
第6单元 面向对象程序设计的原则与设计模式 111
6.1面向对象程序设计的基本原则 111
6.1.1从可重用说起:合成/聚合优先原则 113
6.1.2从可维护性说起:开-闭原则 115
6.1.3面向抽象原则 117
6.1.4单一职责原则 123
6.1.5接口分离原则 124
6.1.6不要和陌生人说话 128
6.2 GoF设计模式 130
6.2.1创建型设计模式 131
6.2.2结构型设计模式 133
6.2.3行为型设计模式 137
习题6 144
第2篇C++++晋阶 149
第7单元C++++常量 149
7.1字面常量 149
7.1.1整型字面常量的表示和辨识 149
7.1.2浮点类型字面常量的表示和辨识 150
7.1.3字符常量 150
7.1.4 bool类型常量 153
7.2 const保护 153
7.2.1用const修饰简单变量 153
7.2.2 const修饰函数 154
7.2.3 const修饰类成员与对象 157
7.2.4 const修饰引用 159
7.2.5 const修饰指针 160
7.3枚举类型 163
7.3.1枚举类型与枚举常量 163
7.3.2枚举变量及其定义 164
7.3.3对枚举变量和枚举元素的操作 164
7.3.4用枚举为类提供整型符号常量名称 165
7.4宏 166
7.4.1宏定义 166
7.4.2整型类型的极值宏 168
7.4.3带参宏定义 169
习题7 172
第8单元 数组——顺序地组织同类型数据 178
8.1数组及其应用 178
8.1.1数组基础 178
8.1.2对象数组的定义与初始化 180
8.1.3数组元素的搜索与排序 182
8.1.4基于容器的for循环 185
8.1.5 const数组 186
8.1.6用数组作为类的数据成员 186
8.1.7数组下标越界问题 189
8.2二维数组 190
8.2.1二维数组的定义 190
8.2.2二维数组的初始化 190
8.2.3二维数组元素的访问 192
8.3数组元素的指针形式 192
8.3.1一维数组元素的指针形式 192
8.3.2二维数组元素的指针形式 194
8.3.3多维数组元素的指针形式 195
8.4栈 196
8.4.1用数组建栈 196
8.4.2栈的应用 197
8.5字符串 198
8.5.1 C字符串 198
8.5.2 string字符串 203
习题8 207
第9单元变量的作用域、生命期、连接性和名字空间 212
9.1基本概念 212
9.1.1标识符的作用域及其分类 212
9.1.2变量的生命期与内存分配 215
9.1.3标识符的连接性 216
9.2 C/C++++的存储属性关键字 217
9.2.1用auto或register定义自动变量 217
9.2.2用extern定义或修饰全局变量 217
9.2.3 static关键词 220
9.3名字空间域 227
9.3.1名字冲突与名字空间 227
9.3.2名字空间的使用 229
9.3.3无名名字空间和全局名字空间 231
习题9 232
第10单元C++++异常处理 236
10.1程序异常及其应对 236
10.1.1程序异常的概念 236
10.1.2程序异常的一般应对 236
10.1.3 C++++异常处理机制 239
10.2 C++++异常类型 241
10.2.1简单异常类型 241
10.2.2用类作为异常类 243
10.2.3 C++++标准异常类 245
10.3常用异常处理技术 247
10.3.1捕获任何异常 247
10.3.2重新抛出异常 248
10.3.3抛出多个异常 251
习题10 253
第11单元 动态内存分配与链表 257
11.1 C++++动态存储分配方法 257
11.1.1存储空间的编译器分配和程序员分配 257
11.1.2用new为单个数据动态分配内存 257
11.1.3用delete回收单个数据的动态存储空间 258
11.1.4数组的动态存储分配 260
11.1.5对象的动态存储分配 261
11.1.6数据成员的动态存储分配 261
11.1.7对象的浅复制与深复制 263
11.2 C++++动态存储分配中的异常处理 264
11.2.1捕获std: : bad_alloc异常 264
11.2.2避免使用std: : bad_alloc 265
11.3链表 265
11.3.1链表及其特点 265
11.3.2单向链表类设计 267
11.3.3单链表的操作与成员函数设计 269
11.3.4链表的测试 273
习题11 276
第3篇C++++探幽 281
第12单元C++++I/O流 281
12.1 C++++流与流类 281
12.1.1流与缓冲区 281
12.1.2 C++++流类库 282
12.1.3 ios类声明 284
12.2标准流对象与标准I/O流操作 285
12.2.1 C++++标准流对象 285
12.2.2标准输入输出流操作 285
12.3流的格式化 286
12.3.1 ios类的格式化成员函数和格式化标志 286
12.3.2格式化操作符 287
12.4文件流 288
12.4.1文件流的概念及其分类 288
12.4.2文件操作过程 288
12.5流的错误状态及其处理 292
12.5.1流的出错状态 292
12.5.2测试与设置出错状态位的ios类成员函数 292
习题12 293
第13单元C++++函数细节 294
13.1函数的参数 294
13.1.1值传递:变量/对象参数 294
13.1.2名字传递:引用参数 296
13.1.3地址传递:地址/指针参数 299
13.1.4函数调用时的参数匹配规则 302
13.1.5关于函数实参的计算顺序 303
13.1.6形参带有默认值的函数 303
13.1.7参数数目可变的函数 305
13.2函数返回 306
13.2.1函数返回的基本特点 306
13.2.2返回指针值的函数 306
13.2.3返回引用的函数 307
13.3函数名重载 310
13.3.1函数名重载的基本方式 310
13.3.2编译器对于函数名重载的匹配规则 310
13.3.3函数名重载的误区 311
13.3.4函数名重载中的二义性 311
13.3.5函数名重载与在派生类中重定义基类成员函数 312
13.4操作符重载 312
13.4.1操作符重载及其规则 313
13.4.2成员函数形式的操作符重载 314
13.4.3友元函数形式的操作符重载 318
13.4.4赋值操作符重载 322
习题13 323
第14单元 类型转换与运行时类型鉴别 331
14.1数据类型转换 331
14.1.1算术类型的隐式转换规则与校验表 331
14.1.2显式类型转换 333
14.1.3对象的向上转换和向下转换 334
14.1.4转换构造函数 334
14.2 dynamic_cast操作符 338
14.2.1 dynamic_cast及其格式 338
14.2.2上行强制类型转换与下行强制类型转换 338
14.2.3交叉强制类型转换 342
14.2.4类指针到void的强制转换 342
14.2.5 dynamic_cast应用实例 342
14.3用typeid获得对象的类型信息 344
14.3.1 type_info类 344
14.3.2 typeid操作符的应用 345
14.3.3关于typeid的进一步说明 346
习题14 347
第15单元 模板 349
15.1算法抽象模板——函数模板 349
15.1.1从函数重载到函数模板 349
15.1.2模板函数重载 350
15.1.3函数模板的实例化与具体化 352
15.2数据抽象模板——类模板 355
15.2.1类模板的定义 355
15.2.2类模板的实例化与具体化 356
15.2.3类模板的使用 357
15.2.4类模板实例化时的异常处理 359
15.3标准模板库 360
15.3.1容器 360
15.3.2算法与函数对象 362
15.3.3迭代器 367
15.3.4 STL标准头文件 370
习题15 371
附录A C++++保留字 377
A.1 C++++关键字 377
A.2替代标记 377
A.3 C++++库保留名称 378
A.4特定字 378
附录B C++++运算符的优先级别和结合方向 379
参考文献 381