第1章 绪论 1
1.1 计算机程序设计语言的发展 1
1.1.1 机器语言与汇编语言 1
1.1.2 高级语言 2
1.1.3 面向对象的语言 2
1.2 面向对象的方法 2
1.2.1 面向对象方法的由来 3
1.2.2 面向对象的基本概念 4
1.3 面向对象的软件开发 5
1.3.1 分析 5
1.3.2 设计 5
1.3.3 编程 6
1.3.4 测试 6
1.3.5 维护 6
1.4 信息的表示与存储 6
1.4.1 计算机的数字系统 6
1.4.2 几种进位记数制之间的转换 8
1.4.3 信息的存储单位 10
1.4.4 二进制数的编码表示 11
1.4.5 定点数和浮点数 15
1.4.6 数的表示范围 15
1.4.7 非数值信息的表示 16
1.5 程序开发的基本概念 16
1.5.1 基本术语 16
1.5.2 完整的程序过程 17
1.6 小结 18
习题 18
第2章 C++简单程序设计 19
2.1 C++语言概述 19
2.1.1 C++的产生 19
2.1.2 C++的特点 20
2.1.3 C++程序实例 20
2.1.4 字符集 21
2.1.5 词法记号 22
2.2 基本数据类型和表达式 23
2.2.1 基本数据类型 24
2.2.2 常量 25
2.2.3 变量 27
2.2.4 符号常量 28
2.2.5 运算符与表达式 28
2.2.6 语句 37
2.3 数据的输入与输出 37
2.3.1 I/O流 37
2.3.2 预定义的插入符和提取符 37
2.3.3 简单的I/O格式控制 38
2.4 算法的基本控制结构 39
2.4.1 用if语句实现选择结构 39
2.4.2 多重选择结构 41
2.4.3 循环结构 44
2.4.4 循环结构与选择结构的嵌套 49
2.4.5 其他控制语句 52
2.5 自定义数据类型 52
2.5.1 typedef声明 53
2.5.2 枚举类型enum 53
2.6 深度探索 55
2.6.1 变量的实现机制 55
2.6.2 C++表达式的执行原理 58
2.7 小结 60
习题 60
第3章 函数 64
3.1 函数的定义与使用 64
3.1.1 函数的定义 64
3.1.2 函数的调用 65
3.1.3 函数的参数传递 78
3.2 内联函数 81
3.3 带默认形参值的函数 82
3.4 函数重载 84
3.5 C++系统函数 86
3.6 深度探索 89
3.6.1 运行栈与函数调用的执行 89
3.6.2 函数声明与类型安全 94
3.7 小结 95
习题 96
第4章 类与对象 98
4.1 面向对象程序设计的基本特点 98
4.1.1 抽象 98
4.1.2 封装 99
4.1.3 继承 100
4.1.4 多态 100
4.2 类和对象 100
4.2.1 类的定义 101
4.2.2 类成员的访问控制 102
4.2.3 对象 103
4.2.4 类的成员函数 104
4.2.5 程序实例 106
4.3 构造函数和析构函数 107
4.3.1 构造函数 107
4.3.2 复制构造函数 109
4.3.3 析构函数 113
4.3.4 程序实例 114
4.4 类的组合 116
4.4.1 组合 116
4.4.2 前向引用声明 120
4.5 UML图形标识 122
4.5.1 UML简介 122
4.5.2 UML类图 123
4.6 结构体和联合体 129
4.6.1 结构体 129
4.6.2 联合体 130
4.7 综合实例——个人银行账户管理程序 133
4.7.1 类的设计 133
4.7.2 源程序及说明 134
4.8 深度探索 137
4.8.1 位域 137
4.8.2 用构造函数定义类型转换 139
4.8.3 对象作为函数参数和返回值的传递方式 140
4.9 小结 143
习题 144
第5章 数据的共享与保护 146
5.1 标识符的作用域与可见性 146
5.1.1 作用域 146
5.1.2 可见性 150
5.2 对象的生存期 150
5.2.1 静态生存期 150
5.2.2 动态生存期 151
5.3 类的静态成员 153
5.3.1 静态数据成员 154
5.3.2 静态函数成员 156
5.4 类的友元 158
5.4.1 友元函数 160
5.4.2 友元类 161
5.5 共享数据的保护 163
5.5.1 常对象 163
5.5.2 用const修饰的类成员 164
5.5.3 常引用 166
5.6 多文件结构和编译预处理命令 168
5.6.1 C++程序的一般组织结构 168
5.6.2 外部变量与外部函数 170
5.6.3 标准C++库 172
5.6.4 编译预处理 173
5.7 综合实例——个人银行账户管理程序 176
5.8 深度探索 180
5.8.1 常成员函数的声明原则 180
5.8.2 代码的编译连接与执行过程 182
5.9 小结 185
习题 185
第6章 数组、指针与字符串 188
6.1 数组 188
6.1.1 数组的声明与使用 188
6.1.2 数组的存储与初始化 190
6.1.3 数组作为函数参数 193
6.1.4 对象数组 194
6.1.5 程序实例 196
6.2 指针 199
6.2.1 内存空间的访问方式 199
6.2.2 指针变量的声明 200
6.2.3 与地址相关的运算“*”和“&” 200
6.2.4 指针的赋值 201
6.2.5 指针运算 203
6.2.6 用指针处理数组元素 205
6.2.7 指针数组 206
6.2.8 用指针作为函数参数 209
6.2.9 指针型函数 210
6.2.10 指向函数的指针 211
6.2.11 对象指针 213
6.3 动态内存分配 218
6.4 用vector创建数组对象 224
6.5 深复制与浅复制 226
6.6 字符串 229
6.6.1 用字符数组存储和处理字符串 230
6.6.2 string类 230
6.7 综合实例——个人银行账户管理程序 234
6.8 深度探索 241
6.8.1 指针与引用 241
6.8.2 指针的安全性隐患及其应对方案 243
6.8.3 const_cast的应用 246
6.9 小结 248
习题 248
第7章 继承与派生 251
7.1 类的继承与派生 251
7.1.1 继承关系举例 251
7.1.2 派生类的定义 252
7.1.3 派生类生成过程 254
7.2 访问控制 256
7.2.1 公有继承 256
7.2.2 私有继承 258
7.2.3 保护继承 260
7.3 类型兼容规则 262
7.4 派生类的构造和析构函数 264
7.4.1 构造函数 265
7.4.2 复制构造函数 267
7.4.3 析构函数 268
7.5 派生类成员的标识与访问 270
7.5.1 作用域分辨符 270
7.5.2 虚基类 276
7.5.3 虚基类及其派生类构造函数 278
7.6 程序实例——用高斯消去法解线性方程组 279
7.6.1 算法基本原理 279
7.6.2 程序设计分析 280
7.6.3 源程序及说明 281
7.6.4 运行结果与分析 286
7.7 综合实例——个人银行账户管理程序 287
7.7.1 问题的提出 287
7.7.2 类设计 288
7.7.3 源程序及说明 289
7.7.4 运行结果与分析 294
7.8 深度探索 295
7.8.1 组合与继承 295
7.8.2 派生类对象的内存布局 298
7.8.3 基类向派生类的转换及其安全性问题 301
7.9 小结 303
习题 304
第8章 多态性 306
8.1 多态性概述 306
8.1.1 多态的类型 306
8.1.2 多态的实现 306
8.2 运算符重载 307
8.2.1 运算符重载的规则 308
8.2.2 运算符重载为成员函数 309
8.2.3 运算符重载为非成员函数 313
8.3 虚函数 315
8.3.1 一般虚函数成员 316
8.3.2 虚析构函数 319
8.4 纯虚函数与抽象类 321
8.4.1 纯虚函数 321
8.4.2 抽象类 322
8.5 程序实例——变步长梯形积分算法求解函数的定积分 324
8.5.1 算法基本原理 324
8.5.2 程序设计分析 325
8.5.3 源程序及说明 326
8.5.4 运行结果与分析 329
8.6 综合实例——对个人银行账户管理程序的改进 329
8.7 深度探索 335
8.7.1 多态类型与非多态类型 335
8.7.2 运行时类型识别 337
8.7.3 虚函数动态绑定的实现原理 340
8.8 小结 343
习题 344
第9章 群体类和群体数据的组织 346
9.1 函数模板与类模板 347
9.1.1 函数模板 347
9.1.2 类模板 350
9.2 线性群体 353
9.2.1 线性群体的概念 353
9.2.2 直接访问群体——数组类 355
9.2.3 顺序访问群体——链表类 363
9.2.4 栈类 368
9.2.5 队列类 374
9.3 群体数据的组织 377
9.3.1 插入排序 377
9.3.2 选择排序 379
9.3.3 交换排序 380
9.3.4 顺序查找 381
9.3.5 折半查找 381
9.4 综合实例——对个人银行账户管理程序的改进 382
9.5 深度探索 385
9.5.1 模板的实例化机制 385
9.5.2 为模板定义特殊的实现 388
9.5.3 模板元编程简介 392
9.6 小结 395
习题 395
第10章 泛型程序设计与C++标准模板库 398
10.1 泛型程序设计及STL的结构 398
10.1.1 泛型程序设计的基本概念 398
10.1.2 STL简介 399
10.2 迭代器 402
10.2.1 输入流迭代器和输出流迭代器 403
10.2.2 迭代器的分类 405
10.2.3 迭代器的区间 407
10.2.4 迭代器的辅助函数 409
10.3 容器 410
10.3.1 容器的基本功能与分类 410
10.3.2 顺序容器 412
10.3.3 关联容器 427
10.4 函数对象 435
10.4.1 函数对象基本概念及分类 436
10.4.2 函数适配器 441
10.5 算法 447
10.5.1 STL算法基础 448
10.5.2 不可变序列算法 448
10.5.3 可变序列算法 451
10.5.4 排序和搜索算法 455
10.5.5 数值算法 459
10.6 综合实例——对个人银行账户管理程序的改进 461
10.7 深度探索 467
10.7.1 swap 467
10.7.2 STL组件的类型特征与STL的扩展 469
10.7.3 Boost简介 476
10.8 小结 478
习题 478
第11章 流类库与输入输出 481
11.1 I/O流的概念及流类库结构 481
11.2 输出流 483
11.2.1 构造输出流对象 483
11.2.2 使用插入运算符和操纵符 484
11.2.3 文件输出流成员函数 488
11.2.4 二进制输出文件 490
11.2.5 字符串输出流 491
11.3 输入流 492
11.3.1 构造输入流对象 492
11.3.2 使用提取运算符 493
11.3.3 输入流操纵符 493
11.3.4 输入流相关函数 493
11.3.5 字符串输入流 497
11.4 输入输出流 498
11.5 综合实例——对个人银行账户管理程序的改进 498
11.6 深度探索 503
11.6.1 宽字符、宽字符串与宽流 503
11.6.2 对象的串行化 507
11.7 小结 510
习题 510
第12章 异常处理 512
12.1 异常处理的基本思想 512
12.2 C++异常处理的实现 512
12.2.1 异常处理的语法 513
12.2.2 异常接口声明 515
12.3 异常处理中的构造与析构 516
12.4 标准程序库异常处理 517
12.5 综合实例——对个人银行账户管理程序的改进 520
12.6 深度探索 523
12.6.1 异常安全性问题 523
12.6.2 避免异常发生时的资源泄漏 525
12.7 小结 528
习题 529