图书目录

第1篇  C++面向对象启步

第1单元  职员类 3

1.1  从具体对象到职员类 3

1.1.1  具体职员对象的分析与描述 3

1.1.2  Employee类的声明 4

1.1.3  C++保留字、标识符与名字空间 5

1.1.4  数据类型 7

1.2  表达式 10

1.2.1  字面值 10

1.2.2  数据实体 10

1.2.3  含有操作符的表达式及其基本求值规则 12

1.3  类的成员函数 13

1.3.1  函数的关键环节 13

1.3.2  对象的生成与构造函数 15

1.3.3  标准输出流out与printEmployee() 函数 17

1.3.4  析构函数 18

1.3.5  一个完整的Employee类 18

1.4  主函数 19

1.4.1  主函数及其结构 19

1.4.2  测试Employee类的主函数 19

1.5  构造函数重载 20

1.5.1  函数重载的概念 20

1.5.2  不同参数数目的构造函数重载 21

1.5.3  复制构造函数 21

1.6  程序编译 24

1.6.1  编译预处理 24

1.6.2  编译与连接 26

1.6.3  多文件程序的编译 26

1.7  知识链接 28

1.7.1  指针=基类型+地址 28

1.7.2  指向对象的指针与this 30

1.7.3  引用 32

习题1 33

第2单元  简单桌面计算器 38

2.1  简单桌面计算器建模 38

2.1.1  简单桌面计算器分析 38

2.1.2  Calculator类的声明 38

2.2  calculate( )函数的实现 39

2.2.1  用if-else结构实现成员函数calculate( ) 39

2.2.2  用switch结构实现calculate( ) 41

2.2.3  if-else判断结构与switch判断结构比较 42

2.2.4  Culculator类测试 43

2.2.5  发现运行异常的程序测试 44

2.3  C++异常处理 45

2.3.1  程序错误 45

2.3.2  C++异常处理机制 47

2.3.3  在同一个函数中抛掷并处理异常 48

2.3.4  异常的抛掷与检测处理分在不同函数中 50

2.3.5  抛掷多个异常 51

2.3.6  用类作为异常类型 52

2.3.7  捕获任何异常 55

2.4  简单桌面计算器的改进 56

2.4.1  使用浮点数计算的Calculator类 56

2.4.2  从键盘输入算式 58

2.5  实现多算式计算 60

2.5.1  用一个数据成员存储中间结果 60

2.5.2  用一个静态局部变量存储中间结果 62

2.5.3  用一个静态成员变量存储中间结果 63

2.6  使用重复结构实现任意多算式计算 65

2.6.1  用while循环实现任意多算式计算 65

2.6.2  用do-while循环实现任意多算式计算 66

2.7  知识链接 67

2.7.1  条件表达式 67

2.7.2  左值表达式与右值表达式 67

2.7.3  标识符的域 69

2.7.4  变量的生命期与存储分配 70

2.7.5  类属变量、实例变量与局部变量的比较 71

习题2 72

第3单元  素数产生器 76

3.1  问题描述与对象建模 76

3.1.1  对象建模 76

3.1.2  getPrimeSequence( )函数的基本思路 77

3.2  使用isPrime(?)的PrimeGenerator类实现 77

3.2.1  用for结构实现的getPrimeSequence(?)函数 77

3.2.2  用for结构实现的isPrime(?)函数 79

3.2.3  完整的PrimeGenerator类及其测试 79

3.3  不使用isPrime(?)的PrimeGenerator类实现 80

3.3.1  采用嵌套重复结构的getPrimeSequence( )函数 80

3.3.2  重复结构中的continue语句和break语句 81

3.4  知识链接 82

3.4.1  C++操作符 82

3.4.2  具有副作用的表达式与序列点 83

3.4.3  算术类型转换 85

3.4.4  类型转换构造函数与explicit关键字 87

3.4.5  表达式类型的推断与获取:auto 与decltype 91

3.4.6  C++语句 92

习题3 93

第4单元  Time类 97

4.1  Time类需求分析与操作符重载 97

4.1.1  Time类需求分析 97

4.1.2  关键字operator与操作符重载 98

4.1.3  操作符+的重载 99

4.1.5  增量操作符++的重载 100

4.1.5  用友元函数实现<<重载 103

4.1.6  赋值操作符=的重载 104

4.1.7  操作符重载的基本规则 105

4.1.8  Time类的类型转换构造函数 107

4.2  浅复制与深复制 109

4.2.1  数据复制及其问题 109

4.2.2  复制构造函数再讨论 111

4.2.3  深复制的赋值操作符重载 113

4.3  动态内存分配 114

4.3.1  用new进行动态内存分配 114

4.3.2  用delete释放动态存储空间 115

4.3.3  对象的动态存储分配 116

4.3.4  动态内存分配时的异常处理 118

4.4  知识链接 119

4.4.1  友元 119

4.4.2  智能指针 123

习题4 124

第2篇  基于类的C++程序架构

第5单元  继承 133

5.1  单基继承 133

5.1.1  公司人员的类层次结构模型 133

5.1.2  C++继承关系的建立 133

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

5.1.4  基于血缘关系的访问控制——protected 139

5.1.5  类层次结构中构造函数和析构函数的执行顺序 140

5.2  类层次中的赋值兼容规则与里氏代换原则 143

5.2.1  公开派生的赋值兼容规则 143

5.2.2  里氏代换原则 144

5.2.3  对象的向上转换和向下转换 144

5.3  多基继承 145

5.3.1  C++多基继承格式 145

5.3.2  计算机系统=软件+硬件问题的类结构 145

5.3.3  多基继承的歧义性问题 148

5.3.4  虚基类 149

习题5 150

第6单元  虚函数与动态绑定 154

6.1  画圆、三角形和矩形问题的类结构 154

6.1.1  3个分立的类 154

6.1.2  为3个分立的类设计一个公共父类 154

6.2  用虚函数实现动态绑定 155

6.2.1  虚函数与动态绑定 155

6.2.2  虚函数表 156

6.2.3  虚函数规则 157

6.2.4  用override和final修饰虚函数 159

6.2.5  纯虚函数与抽象类 161

6.3  运行时类型鉴别 163

6.3.1  RTTI概述 163

6.3.2  dynamic_cast 163

6.3.3  type_info类与typeid操作符 169

习题6 172

第7单元  面向对象程序结构优化 176

7.1  面向对象程序设计优化规则 176

7.1.1  引言 176

7.1.2  从可重用说起:合成/聚合优先原则 178

7.1.3  从可维护性说起:开闭原则 180

7.1.4  面向抽象原则 182

7.1.5  单一职责原则 188

7.1.6  接口分离原则 189

7.1.7  不要和陌生人说话 193

7.2  GoF设计模式举例:工厂模式 195

7.2.1  概述 195

7.2.2  简单工厂模式 196

7.2.3  工厂方法模式 198

习题7 200

第3篇  泛型程序设计

第8单元  模板 205

8.1  算法抽象模板——函数模板 205

8.1.1  从函数重载到函数模板 205

8.1.2  函数模板的实例化与具体化 206

8.2  数据抽象模板——类模板 209

8.2.1  类模板的定义 209

8.2.2  类模板的实例化与具体化 210

8.2.3  类模板的使用 211

8.2.4  类模板实例化时的异常处理 213

8.2.5  实例:MyVector模板类的设计 214

8.3  知识链接:数组 218

8.3.1  数组的特点 218

8.3.2  数组的定义与泛化常量表达式 218

8.3.3  数组的初始化规则 220

8.3.4  对象数组 221

8.3.5  数组存储空间的动态分配 223

习题8 223

第9单元  STL编程 230

9.1  STL概述 230

9.1.1  容器 230

9.1.2  迭代器 232

9.1.3  容器的成员函数 235

9.1.4  STL算法 238

9.1.5  函数对象 241

9.1.6  基于范围的for循环 243

9.1.7  STL标准头文件 244

9.2  扑克游戏——vector容器应用实例 245

9.2.1  vector容器的特点 245

9.2.2  扑克游戏对象模型 245

9.2.3  用vector容器对象poker存储54张扑克牌 246

9.2.4  洗牌函数设计 249

9.2.5  整牌函数设计 252

9.2.6  发牌函数设计 253

9.2.7  vector操作小结 256

9.3  list容器及其应用实例 257

9.3.1  构建list对象及其迭代器 257

9.3.2  操作list对象 258

9.3.3  基于list容器的约瑟夫斯问题求解 262

9.4  string 265

9.4.1  字符串对象的创建与特性描述 266

9.4.2  字符串对象的输入/输出 266

9.4.3  字符串的迭代器与字符操作 267

9.4.4  两字符串间的操作 271

9.5  stack容器 273

9.5.1  stack及其特点 273

9.5.2  stack的操作 273

9.5.3  应用举例:将一个十进制整数转换为K进制数 274

9.6  关联容器 276

9.6.1  用结构体定义的pair类模板 276

9.6.2  set和multiset容器 278

9.6.3  map和multimap容器 282

9.7  知识链接 286

9.7.1  const_iterator 286

9.7.2  分配器 287

习题9 288

第4篇  C++深入编程

第10单元  C++实体与名字 293

10.1  C++的存储属性 293

10.1.1  外部变量与extern关键字 293

10.1.2  static关键字 296

10.2  名字空间域 301

10.2.1  名字冲突与名字空间 301

10.2.2  名字空间的使用 305

10.2.3  无名名字空间和全局名字空间 307

习题10 308

第11单元  C++字面值与常量 311

11.1  字面值 311

11.1.1  整型字面值的表示和辨识 311

11.1.2  浮点类型字面值的表示和辨识 312

11.1.3  字符字面值 313

11.1.4  bool类型与bool常量 314

11.1.5  枚举类型与枚举常量 315

11.1.6  强类型枚举 317

11.2  const关键字 318

11.2.1  const符号常量 318

11.2.2  const用于指针声明 320

11.2.3  const限定类成员与对象 323

11.3  C++11的右值引用 326

11.3.1  右值引用的概念 326

11.3.2  C++11关于左值和右值概念的深化 327

11.3.3  C++的引用绑定规则 327

11.3.4  C++11的引用折叠规则 329

11.3.5  C++11的模板参数类型推导规则 330

习题11 330

第12单元  C++函数探幽 336

12.1  函数调用时的参数匹配与保护 336

12.1.1  函数调用时的参数匹配规则 336

12.1.2  形参带有默认值的函数 337

12.1.3  参数数目可变的函数 339

12.2  参数类型 339

12.2.1  值传递:变量/对象参数 339

12.2.2  地址传递:地址/指针参数 341

12.2.3  数组参数 342

12.2.4  名字传递:引用参数 344

12.2.5  const限定函数参数 347

12.3  移动语义与完美转发 348

12.3.1  移动语义 348

12.3.2  完美转发 351

12.4  函数返回 354

12.4.1  函数返回的基本规则 354

12.4.2  返回指针类型的函数 355

12.4.3  类型的返回左值引用 356

12.4.4 ??const限定函数返回值 358

12.5  Lambda表达式 360

12.5.1  简单的Lambda表达式 360

12.5.2  在方括号中加入函数对象参数 361

习题12 363

第13单元  C++ I/O流 366

13.1  流与C++流类 366

13.1.1  流与缓冲区 366

13.1.2  C++流类库 367

13.1.3  ios类声明 369

13.2  标准流对象与标准I/O流操作 370

13.2.1  C++标准流对象 370

13.2.2  标准输入/输出流操作 370

13.3  流的格式化 371

13.3.1  ios类的格式化成员函数和格式化标志 371

13.3.2  格式化操作符 371

13.4  文件流 372

13.4.1  文件流的概念及其分类 372

13.4.2  文件操作过程 373

13.5  流的错误状态及其处理 377

13.5.1  流的出错状态 377

13.5.2  测试与设置出错状态位的ios类成员函数 377

习题13 377

附录A  C++保留字 379

A.1  C++关键字 379

A.2  C++替代标记 379

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

A.4  C++特定字 380

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

附录C  C++标准库 383

C.1  C++标准库头文件 383

C.1.1  标准库中与语言支持功能相关的头文件 383

C.1.2  支持流输入/输出的头文件 384

C.1.3  与诊断功能相关的头文件 384

C.1.4  定义工具函数的头文件 384

C.1.5  支持字符串处理的头文件 384

C.1.6  定义容器类的模板的头文件 384

C.1.7  支持迭代器的头文件 385

C.1.8  有关算法的头文件 385

C.1.9  有关数值操作的头文件 385

C.1.10  有关本地化的头文件 385

C.2  Boost库内容 385

C.2.1  字符串和文本处理库 386

C.2.2  容器库 386

C.2.3  迭代器库 387

C.2.4  算法库 387

C.2.5  函数对象和高阶编程库 387

C.2.6  泛型编程库 388

C.2.7  模板元编程 388

C.2.8  预处理元编程库 388

C.2.9  并发编程库 388

C.2.10  数学和数字库 388

C.2.11  排错和测试库 389

C.2.12  数据结构库 389

C.2.13  图像处理库 389

C.2.14  输入/输出库 390

C.2.15  跨语言混合编程库 390

C.2.16  内存管理库 390

C.2.17  解析库 390

C.2.18  编程接口库 390

C.2.19  综合类库 390

C.2.20  编译器问题的变通方案库 391

参考文献 392