图书目录

第1篇 面向对象奠基

第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

习题115

第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 语法知识扩展131

2.5.1 C++程序的组成31

2.5.2 类与对象31

2.5.3 C++单词32

2.5.4 数据类型初步33

2.5.5 变量与常量35

习题236

第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

习题360

第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 语法知识扩展271

4.4.1 C++语句71

4.4.2 函数72

4.4.3 对象的存储73

习题474

第5单元 简单的公司人员体系77

5.1 公司人员的类层次结构77

5.1.1 问题建模77

5.1.2 类层次结构声明77

5.1.3 在派生类中重定义基类成员函数80

5.1.4 类层次结构中成员函数执行规则82

5.1.5 基于血缘关系的访问控制--protected85

5.2 指针与引用85

5.2.1 指针=基类型+地址85

5.2.2 指向对象的指针与this88

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

习题5103

第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

习题6144

第2篇 C++晋阶

第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

习题7172

第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

习题8207

第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

习题9232

第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

习题10253

第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_alloc265

11.3 链表265

11.3.1 链表及其特点265

11.3.2 单向链表类设计267

11.3.3 单链表的操作与成员函数设计269

11.3.4 链表的测试273

习题11276

第3篇 C++探幽

第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

习题12293

第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

习题13323

第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

习题14347

第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

习题15371附录A C++保留字377

A.1 C++关键字377

A.2 替代标记377

A.3 C++库保留名称378

A.4 特定字378

附录B C++运算符的优先级别和结合方向379

参考文献381