第1部分 C++语言 1
1.2 C与C++的比较 2
1.1 C语言和C++语言的历史 2
第1章 C++语言概述 2
1.3 C++简述 3
1.4 main()函数 5
1.5 小结 6
2.1 学习编写第一个程序 7
2.1.4 main()函数的语句块 8
第2章 编写简单的C++程序 8
2.1.3 main()函数声明 8
2.1.1 #include指令 8
2.1.2 空行 8
2.2 标识符 9
2.1.8 语句块的结束 9
2.1.5 源代码注释 9
2.1.6 控制台输出 9
2.1.7 return语句 9
2.4 标准输出流 10
2.3 关键字 10
2.5.1 布尔型变量 11
2.5 变量 11
2.5.2 字符型变量 12
2.5.3 wchar_t型变量 13
2.5.4 整型变量 14
2.6 常量 15
2.5.5 浮点型变量 15
2.6.2 转义字符 16
2.6.1 字符型常量 16
2.6.5 地址常量 17
2.6.4 浮点型常量 17
2.6.3 整型常量 17
2.7 表达式 18
2.6.6 字符串常量 18
2.8 赋值语句 19
2.9 用逗号分隔的声明语句 20
2.10.1 算术运算符 21
2.10 表达式中的运算符 21
2.10.2 逻辑运算符 22
2.10.3 位逻辑运算符 23
2.10.5 关系运算符 24
2.10.4 位移运算符 24
2.10.6 自增运算符和自减运算符 25
2.10.7 赋值运算符 27
20.2.3 关联式容器 28
2.10.8 复合赋值运算符 28
20.2.6 谓词 29
2.10.9 条件运算符 29
2.10.10 逗号运算符 31
2.11 运算符的优先级与结合性 32
2.11.1 结合性 32
2.11.2 优先级 33
2.12 表达式不参加运算的情况 33
2.13 初始化 34
2.14 类型转换 35
2.15 控制台输入与输出 36
2.15.1 标准输出流 36
2.15.2 格式化输出 37
2.15.3 标准错误流 38
2.15.4 标准输入流 39
6.5.1 堆 39
2.16 小结 40
3.1 函数 42
第3章 函数 42
3.2 实际参数和形式参数 43
3.3.1 无标识符的参数类型 43
3.3 函数原型 43
3.3.2 一个典型的函数原型 44
3.3.4 参数列表为空的函数 44
3.3.5 参数列表可变的函数 44
3.3.3 返回类型为void的函数 44
3.3.6 既不带参数也没有返回值的函数 45
3.3.8 不需要原型的函数 45
3.4 定义和调用函数 45
3.3.7 标准库函数的原型 45
3.5 从函数返回 46
3.6 函数的返回值 48
3.7 传递和使用参数 49
3.7.2 通过函数调用来进行初始化 50
3.7.3 初始化的顺序 50
3.7.1 标识符的作用域 50
3.7.4 具有多个参数的函数 51
3.7.6 值传递 52
3.7.7 实际参数和返回值的类型转换 52
3.8 无名形式参数 52
3.7.5 用做实际参数的函数调用 52
3.9 默认的函数参数 53
3.10 内联函数 54
3.11 递归 55
3.12.1 为不同的操作而重载 55
3.12 函数的重载 55
3.12.2 为不同的格式而重载 57
3.14 链接说明 58
3.13 安全链接 58
3.15 小结 62
4.1 语句块 63
4.1.1 语句块的嵌套深度 63
4.1.2 缩进风格 63
第4章 C++的程序流程控制 63
4.2 分支语句 64
4.2.1 if语句 64
4.2.2 if...else语句 67
4.2.3 else if语句 67
4.2.4 switch...case语句 69
4.2.5 在if语句的条件表达式中进行变量声明 70
4.3 循环语句 71
4.3.1 while语句 71
4.3.2 do...while语句 72
4.3.3 for语句 74
4.3.4 在for语句的条件表达式中声明变量 76
4.4.1 break语句 76
4.4 循环控制语句 76
4.4.2 continue语句 77
4.5 跳转语句:goto 78
4.5.1 goto语句的错误用法 79
4.5.3 改正错误的goto语句 80
4.5.2 C++语言的goto语句和C语言的goto语句的比较 80
4.5.4 是否应该使用goto语句 82
4.6 小结 82
第5章 数据类型 83
5.1.1 全局作用域 83
5.1 标识符的作用域 83
5.1.2 局部作用域 84
5.1.3 全局作用域解析符 86
5.1.4 文件作用域 87
5.1.5 变量的作用域和生存周期 88
5.2 存储类 89
5.2.1 自动存储类 89
5.2.2 静态存储类 90
5.2.3 外部存储类 91
5.2.4 寄存器存储类 92
5.3 初始化的默认值 93
5.4 类型修饰符 94
5.4.1 const类型修饰符 94
5.4.2 volatile类型修饰符 95
5.5 用户定义的数据类型 95
5.5.1 声明结构 96
5.5.3 引用结构成员 96
5.5.2 定义结构变量 96
5.5.4 初始化结构变量 97
5.5.5 结构的嵌套 98
5.5.6 向函数传递结构和从函数返回结构 99
5.6 联合数据类型 100
5.6.1 初始化联合 102
5.6.2 匿名联合 103
5.6.3 枚举常量 104
5.7.1 声明数组 105
5.7.2 利用下标访问数组元素 105
5.7 数组 105
5.7.3 初始化数组 106
5.7.4 结构数组 107
5.7.5 多维数组 108
5.7.6 字符型数组:一个特例 109
5.8 小结 110
6.1 地址和指针 111
6.1.1 指向内部数据类型的指针 111
第6章 地址、指针和引用型变量 111
6.1.2 指针的算术运算 113
6.1.3 指针和数组的关系 115
6.1.4 指向结构的指针 118
6.1.5 作为函数参数的指针 119
6.1.6 以地址作为函数的返回值 122
6.1.7 指向函数的指针 124
6.1.8 指向指针的指针 127
6.1.9 指向指针数组的指针 128
6.1.10 指向const型变量的指针 129
6.1.11 const型指针变量 131
6.1.12 void型指针 132
6.2 sizeof运算符 134
6.3 强制类型转换 136
6.3.2 typedef 136
6.3.1 C风格的强制类型转换 136
6.4 命令行参数:argc和argv 138
6.5 程序的内存结构 139
6.5.2 new运算符和delete运算符 139
6.5.3 为大小固定的数组分配内存 140
6.5.4 为动态数组分配内存 141
6.5.5 堆耗尽时的处理 142
6.5.6 栈 142
6.6 递归 143
6.6.1 一个简单的递归函数 143
6.6.2 一个利用递归实现的计算器程序 145
6.7 引用型变量 148
6.7.1 引用是一个别名 149
6.7.2 初始化引用 150
6.7.3 用引用来简化复杂的表示法 151
6.7.4 用做函数形参的引用 152
6.7.5 以引用方式调用函数 154
6.7.6 const型引用形参 155
6.7.7 作为函数返回值的引用 155
6.7.8 以const型引用作为返回值 157
6.7.9 返回指向自变量的引用 157
6.7.10 引用和指针 157
6.8 小结 158
第7章 库函数 159
7.1 <cassert>头文件 160
7.2 <cctype>头文件 161
7.3 <cerrno>头文件 162
7.4 <cmath>头文件 163
7.5 <csetjmp>头文件 164
7.6 <cstdarg>头文件 166
7.7 <cstdio>头文件 167
7.8 <cstdlib>头文件 168
7.8.1 数字函数 168
7.8.2 内存管理函数 168
7.8.3 系统函数 168
7.8.4 随机数发生器函数 169
7.9 <cstring>头文件 170
7.10 <ctime>头文件 172
7.11 小结 173
第8章 预处理程序 174
8.1 预处理指令 174
8.2 包含文件 174
8.3 宏 175
8.3.1 #define预处理指令 175
8.3.2 带参数的#define预处理指令 176
8.3.3 格式和对齐 181
8.3.4 #字符串化运算符 182
8.3.5 ##符号连接运算符 182
8.3.6 #undef预处理指令 184
8.4 条件编译指令 184
8.4.1 #if预处理指令 184
8.4.2 #endif预处理指令 184
8.4.3 #if defined预处理指令 185
8.4.4 #ifdef和#ifndef预处理指令 186
8.4.5 #else预处理指令 186
8.4.6 #elif预处理指令 186
8.4.7 #error预处理指令 187
8.5 其他预处理指令 188
8.5.1 #line预处理指令 188
8.5.2 #pragma预处理指令 188
8.6 小结 188
第9章 类与结构 189
9.1 C++的类 189
9.2 数据类型的属性 189
9.2.1 数据表示 189
9.2.2 实现 190
9.2.3 行为 190
9.2.4 接口 190
9.3 用户定义的数据类型 190
9.3.1 抽象 190
9.3.2 对象是什么 190
9.3.3 数据抽象和面向过程编程 190
9.3.4 数据抽象和封装 192
9.4 带有函数的结构 192
9.4.1 向结构添加函数 192
9.4.2 同一结构的多个实例 194
9.4.3 具有相同名称函数的不同结构 195
9.5 访问控制符 197
9.6 是滞应该使用面向过程编程 197
9.7 结构和类的比较 198
9.8 联合 198
9.9 小结 198
第10章 函数模板 199
10.1 函数模板基础知识 199
10.2 数的定制 201
10.3 利用模板进行排序 204
10.4 小结 206
第2部分 使用类 207
第11章 C++类 208
11.1 设计类 208
11.1.1 对类进行声明 208
11.1.2 类成员 210
11.1.3 类成员的可见性 210
11.1.4 类的数据成员 210
11.1.5 初始化类对象 210
11.1.6 类的成员函数 211
11.1.7 面向对象的类的设计 211
11.1.8 类对象的作用域 212
11.1.9 内联函数 212
11.2 构造函数 214
11.2.1 具有默认参数的构造函数 214
11.2.2 默认构造函数 215
11.2.3 重载构造函数 215
11.3 析构函数 217
11.4 类的转换 217
11.4.1 转换函数 217
11.4.2 对类进行转换 221
11.4.3 调用转换函数 223
11.4.4 转换发生的情形 224
11.4.5 显式构造函数 227
11.4.6 表达式中的转换 227
11.5 私有数据成员 228
11.5.1 取值成员函数和赋值成员函数 228
11.5.2 常量成员函数 230
11.5.3 经过改进的成员转换函数 230
11.6 友元 231
11.6.1 友元类 231
11.6.2 隐式构造函数 233
11.6.3 预引用 233
11.6.4 显式友元预引用 234
11.6.5 友元函数 235
11.6.6 匿名对象 236
11.6.7 非类成员的友元函数 237
11.7 析构函数 238
11.8 重载赋值运算符函数 240
11.9 this指针 243
11.9.1 用this指针作为返回值 243
11.9.2 在链表中使用this指针 246
11.10 类对象数组 248
11.10.1 类对象数组和默认构造函数 249
11.10.2 类对象数组和析构函数 251
11.11 静态成员 252
11.11.1 静态数据成员 252
11.11.2 静态成员函数 254
11.11.3 公有静态成员 256
11.12 类和堆 256
11.12.1 构造函数和new运算符、析构函数和delete运算符 256
11.12.2 堆和类数组 257
11.12.3 在类内部重载new和delete运算符 260
11.12.4 异常检测 262
11.12.5 重载new和delete运算符函数中的异常处理 262
11.12.6 重载new[]和delete[]运算符 262
11.13 复制构造函数 264
11.14 类中的引用 267
11.15 构造函数的参数初始化表 269
11.16 关于const修饰符的简单说明 270
11.17 可变数据成员 272
11.18 对类的源文件和目标文件的管理 273
11.18.1 头文件中的类声明 273
11.18.2 库中的类成员函数 273
11.19 小结 273
第12章 运算符重载 274
12.1 重载运算符的时机 274
12.2 重载运算符举例 275
12.3 重载运算符的规则 275
12.4 双目算术运算符 276
12.5 类成员运算符函数 276
12.6 非类成员运算符函数 278
12.7 关系运算符 280
12.8 其他赋值运算符 282
12.9 自增运算符和自减运算符 284
12.10 单目正和单目负运算符 286
12.11 下标运算符 287
12.12 成员指针运算符 288
12.13 小结 290
第13章 类继承 292
13.1 继承 292
13.2 进行继承的原因 294
13.3 设计定制的数据抽象类 294
13.3.1 基类 295
13.3.2 旨在提高效率的设计 297
13.3.3 单一继承 300
13.3.4 派生类 300
13.3.5 受保护成员 300
13.3.6 派生成员和定制成员 301
13.3.7 公有基类和私有基类 301
13.3.8 基类和派生类的构造函数 301
13.3.9 定制新的成员函数 302
13.3.10 通过重定义基类成员函数进行定制 302
13.3.11 编写程序 303
13.3.12 用于基类和派生类的作用域运算符 304
13.3.13 多个派生类 305
13.3.14 第二个派生类 305
13.3.15 使用基类和两个派生类 307
13.3.16 派生类之间的关系 308
13.3.17 从派生类派生出来的类 308
13.4 问题域类层次结构的设计 311
13.4.1 C++与纯面向对象的设计 312
13.4.2 更多的数据抽象 313
13.4.3 重载<<和>>运算符 314
13.4.4 SSN和Money类 316
13.4.5 包含头文件 318
13.4.6 C++的标准字符串类 319
13.5 Person:基类 319
13.5.1 枚举数据类型 322
13.5.2 虚函数 322
13.5.3 抽象基类:纯虚函数 322
13.5.4 两种数据显示方式 322
13.6 派生类 322
13.6.1 Employee类 322
13.6.2 函数重定义 324
13.6.3 WagedEmployee类 324
13.6.4 SalariedEmployee类 326
13.6.5 Contractor类 327
13.6.6 构造目标代码库 329
13.6.7 问题域类层次结构 329
13.6.8 通过引用调用虚函数 332
13.6.9 通过引用调用非虚函数 333
13.6.10 调用重定义的虚函数 333
13.6.11 没有被派生类重定义的虚函数 333
13.6.12 虚析构函数 333
13.6.13 应该将哪些成员函数定义为虚函数 336
13.7 多态性 336
13.8 小结 337
第14章 多重继承 338
14.1 多个基类 338
14.1.1 多重继承中的构造函数的执行 339
14.1.2 多重继承中的析构函数的执行 339
14.2 细化资产系统设计 339
14.3 对多重继承中的成员进行重定义 341
14.4 多重继承中的二义性问题 341
14.4.1 具有二义性的成员函数 342
14.4.2 具有二义性的数据成员 342
14.4.3 在设计时解决二义性问题 342
14.4.4 不可避免的二义性问题 343
14.5 虚基类 344
14.6 实现所设计的类层次结构 345
14.6.1 DisplayObject类 345
14.6.2 Vehicle类 345
14.6.3 Property类 346
14.6.4 Asset类和Expense类 347
14.6.5 Computer类和Pencils类 349
14.6.6 CompanyCar类和LeaseCar类 349
14.6.7 应用程序 349
14.7 回顾 350
14.8 小结 351
第15章 类模板 352
15.1 基础知识 352
15.2 声明类模板的多个对象 353
15.3 调用类模板的成员函数 353
15.4 声明多个参数 353
15.5 有界数组类模板 356
15.6 何时使用类模板 358
15.7 链表模板 359
15.7.1 整型链表模板 363
15.7.2 日期链表模板 364
15.8 模板的定制 365
15.8.1 类模板的定制 366
15.8.2 模板成员函数的定制 367
15.8.3 模板的部分定制 368
15.9 默认的类模板参数 370
15.10 小结 371
第16章 面向对象程序设计 372
16.1 基础知识 372
16.2 过程化程序设计 372
16.3 面向对象程序设计 373
16.3.1 面向对象的程序 373
16.3.2 对象 374
16.3.3 抽象 374
16.3.4 封装 375
16.3.5 方法和消息 376
16.3.6 成员函数 378
16.3.7 继承 378
16.3.8 类的关系 379
16.3.9 多态性 379
16.4 小结 379
第3部分 标准C++库 381
第17章 标准C++库简介 382
17.1 std∷string类 382
17.1.1 构造字符串 382
17.1.2 对字符串进行赋值 382
17.1.3 连接字符串 383
17.1.4 字符串的下标 383
17.1.5 比较字符串 383
17.1.6 子串 383
17.1.7 搜索字符串 384
17.1.8 字符串操作 384
17.2 输入/输出流 384
17.2.1 流类 385
17.2.2 缓冲输出 385
17.2.3 格式化输出 386
17.2.4 文件输入/输出 394
17.3 std∷complex类 396
17.4 标准模板库 397
17.5 标准异常 398
17.6 小结 400
第18章 格式化iostream类和stringstream类 401
18.1 格式化输出 401
18.2 操纵算子、格式化标志和成员函数 402
18.2.1 std∷ios∷width()函数 402
18.2.2 std∷setw操纵算子 403
18.2.3 std∷ios∷fill()函数 404
18.2.4 输出对齐 404
18.2.5 setprecision操纵算子 405
18.2.6 科学记数法和定点记数法 406
18.2.7 std∷ios∷setf()和std∷ios∷unsetf()函数 407
18.2.8 格式化标志 407
18.2.9 格式化操纵算子 408
18.2.10 格式化函数 408
18.3 小结 410
第19章 文件输入/输出流 411
19.1 文件流类的层次结构 411
19.2 std∷ofstream类 411
19.3 std∷ifstream类 416
19.3.1 读取文件直至文件结束 417
19.3.2 在文件中定位 418
19.3.3 读取和写入流文件 420
19.3.4 建立和解除文件与流的关联 421
19.4 二进制文件与文本文件 422
19.5 std∷fstream类 422
19.6 小结 423
第4部分 标准模板库 425
第20章 标准模板库概述 426
20.1 需要STL的原因 426
20.2 STL程序设计模型 426
20.2.1 序列 427
20.2.2 容器适配器 427
20.2.4 迭代器 428
20.2.7 分配器 429
20.2.5 算法 429
20.3 小结 430
21.2 向量类模板 431
21.1 序列式容器概述 431
第21章 序列 431
21.2.1 插入向量元素 433
21.2.2 删除向量元素 435
21.2.3 比较向量 437
21.2.4 向量的成员函数 438
21.3 双端队列类模板 439
21.3.1 向双端队列插入元素 440
21.3.2 删除双端队列中的元素 442
21.3.3 比较双端队列 444
21.3.4 双端队列的成员函数 445
21.4 链表类模板 446
21.4.1 插入链表元素 447
21.4.2 删除链表元素 450
21.4.3 比较链表 451
21.5 std∷stack容器适配器 453
21.4.4 链表的成员函数 453
21.6 std∷queue容器适配器 455
21.7 std∷priority_queue容器适配器 457
21.8 小结 458
22.2 std∷set类模板 459
22.1 关联式容器简介 459
第22章 关联式容器 459
22.2.1 向集合中插入元素 460
22.2.2 从集合中删除元素 461
22.2.3 在集合中查找元素 463
22.2.4 对集合进行比较 464
22.2.5 集合的成员函数 465
22.3 std∷multiset类模板 466
22.3.1 向多重集合中插入元素 467
22.3.2 从多重集合中删除元素 468
22.3.3 在多重集合中查找元素 470
22.3.4 对多重集合进行比较 471
22.3.5 多重集合的成员函数 473
22.4 std∷map类模板 474
22.4.1 向映射中插入元素 475
22.4.2 从映射中删除元素 477
22.4.3 在映射中查找元素 478
22.4.4 对映射进行比较 480
22.4.5 映射的成员函数 481
22.5 std∷multimap类模板 482
22.5.1 向多重映射中插入元素 483
22.5.2 从多重映射中删除元素 484
22.5.3 在多重映射中查找元素 485
22.5.4 对多重映射进行比较 487
22.5.5 多重映射的成员函数 488
22.6.1 在位集合中对位进行操作 489
22.6 std∷bitset类模板 489
22.6.2 在位集合中测试位的状态 491
22.6.3 对位集合进行比较 492
22.7 用户定义的谓词 494
22.6.4 位集合的成员函数 494
22.8 小结 497
23.2 非修正序列算法 498
23.1 通用算法概述 498
第23章 通用算法 498
23.3 修正序列算法 503
23.4 排序算法 509
23.5 数值算法 519
23.6 小结 525
第24章 迭代器 526
24.1 迭代器简介 526
24.2 输入迭代器 526
24.3 输出迭代器 528
24.4 前向迭代器 529
24.5 双向迭代器 530
24.6 随机访问迭代器 532
24.7 特殊用途的迭代器 535
24.7.1 流迭代器 535
24.7.2 迭代器适配器 538
24.8 小结 543
第25章 异常处理 544
25.1 C语言中的异常处理 544
25.2.1 try块 546
25.2.2 catch异常处理模块 546
25.2 C++语言中的异常处理 546
25.2.3 throw语句 547
25.2.4 try/throw/catch语句 547
25.2.5 异常指定 550
25.2.6 不可预见的异常 551
25.2.7 catch-all异常处理模块 551
25.2.8 从一个处理模块中抛出异常 553
25.2.9 未经捕获的异常 554
25.3 在抛出的异常中进行选择 556
25.4 异常及未释放的资源 558
25.5 一个改进的计算器程序 558
25.6 小结 562
第5部分 C++语言的高级主题 563
第26章 名字空间 564
26.1 名字空间简介 564
26.2 名字空间的成员 565
26.3 using namespace语句 565
26.4 定义名字空间 567
26.5 嵌套名字空间 569
26.6 无名名字空间 570
26.7 名字空间的别名 570
26.8 小结 572
27.1 新风格类型转换 573
27.1.1 dynamic_cast 573
第27章 新风格类型转换和运行时类型信息 573
27.1.2 static_cast 577
27.1.3 reinterpret_cast 578
27.1.4 const_cast 579
27.2 运行时类型信息 581
27.3 小结 582
第28章 区域表示 583
28.1 国际化元素 583
28.2.2 默认区域表示与全局区域表示 584
28.2.1 标准侧面 584
28.3 创建区域表示对象 584
28.2 std∷locale类 584
28.4 创建混合区域表示 587
28.5 流与区域表示 588
28.6 对侧面进行操作 589
28.7 小结 591
附录 关于光盘 592