导论 3
第1章 致读者 3
1.1本书的结构 3
1.1.1例子和参考 4
1.1.2练习 5
1.1.3有关实现的注记 5
1.2学习C++ 6
1.3 C++的设计 7
1.3.1效率和结构 8
1.3.2哲学注记 9
1.4历史注记 9
1.5 C++的使用 11
1.6 C和C++ 12
1.6.1给C程序员的建议 13
1.6.2给C++程序员的建议 13
1.7有关在C++里编程的思考 14
1.8忠告 15
1.9参考文献 16
第2章 C++概览 19
2.1为什么是C++ 19
2.2程序设计范型 19
2.3过程式程序设计 20
2.3.1变量和算术 21
2.3.2检测和循环 22
2.3.3指针和数组 23
2.4模块程序设计 23
2.4.1分别编译 24
2.4.2异常处理 25
2.5数据抽象 26
2.5.1定义类型的模块 27
2.5.2用户定义类型 28
2.5.3具体类型 29
2.5.4抽象类型 31
2.5.5虚函数 33
2.6面向对象的程序设计 33
2.6.1具体类型的问题 33
2.6.2类层次结构 34
2.7通用型程序设计 36
2.7.1容器 36
2.7.2通用型算法 37
2.8附言 38
2.9忠告 39
第3章 标准库概览 40
3.1引言 40
3.2 Hello, world! 40
3.3标准库名字空间 41
3.4输出 41
3.5字符串 42
3.5.1 C风格的字符串 44
3.6输入 44
3.7容器 46
3.7.1向量——vector 46
3.7.2范围检查 47
3.7.3表——list 48
3.7.4映射——map 49
3.7.5标准容器 49
3.8算法 50
3.8.1迭代器的使用 51
3.8.2迭代器类型 52
3.8.3迭代器和I/O 53
3.8.4遍历和谓词 54
3.8.5使用成员函数的算法 56
3.8.6标准库算法 56
3.9数学 57
3.9.1复数 57
3.9.2向量算术 57
3.9.3基本数值支持 58
3.10标准库功能 58
3.11忠告 58
第一部分 基本功能 63
第4章 类型和声明 63
4.1类型 63
4.1.1基本类型 64
4.2布尔量 64
4.3字符类型 65
4.3.1字符文字量 66
4.4整数类型 66
4.4.1整数文字量 66
4.5浮点类型 67
4.5.1浮点文字量 67
4.6大小 68
4.7void 69
4.8枚举 69
4.9声明 71
4.9.1声明的结构 72
4.9.2声明多个名字 73
4.9.3名字 73
4.9.4作用域 74
4.9.5初始化 75
4.9.6对象和左值 76
4.9.7 typedef 76
4.10忠告 77
4.11练习 77
第5章 指针、数组和结构 79
5.1指针 79
5.1.1零 80
5.2数组 80
5.2.1数组初始化 80
5.2.2字符串文字量 81
5.3到数组的指针 83
5.3.1在数组里漫游 83
5.4常量 85
5.4.1指针和常量 87
5.5引用 88
5.6指向void的指针 90
5.7结构 91
5.7.1类型等价 94
5.8忠告 94
5.9练习 94
第6章 表达式和语句 96
6.1一个桌面计算器 96
6.1.1分析器 96
6.1.2输入函数 100
6.1.3低级输入 102
6.1.4错误处理 103
6.1.5驱动程序 104
6.1.6头文件 104
6.1.7命令行参数 105
6.1.8有关风格的注记 106
6.2运算符概览 107
6.2.1结果 109
6.2.2求值顺序 110
6.2.3运算符优先级 110
6.2.4按位逻辑运算符 111
6.2.5增量和减量 112
6.2.6自由存储 113
6.2.7显式类型转换 116
6.2.8构造函数 117
6.3语句概览 118
6.3.1声明作为语句 119
6.3.2选择语句 119
6.3.3迭代语句 122
6.3.4 goto 123
6.4注释和缩进编排 123
6.5忠告 125
6.6练习 125
第7章 函数 128
7.1函数声明 128
7.1.1函数定义 128
7.1.2静态变量 129
7.2参数传递 130
7.2.1数组参数 131
7.3返回值 132
7.4重载函数名 133
7.4.1重载和返回类型 135
7.4.2重载与作用域 135
7.4.3手工的歧义性解析 135
7.4.4多参数的解析 136
7.5默认参数 137
7.6未确定数目的参数 138
7.7指向函数的指针 139
7.8宏 143
7.8.1条件编译 145
7.9忠告 145
7.10练习 146
第8章 名字空间和异常 148
8.1模块化和界面 148
8.2名字空间 150
8.2.1带限定词的名字 151
8.2.2使用声明 152
8.2.3使用指令 153
8.2.4多重界面 154
8.2.5避免名字冲突 157
8.2.6名字查找 159
8.2.7名字空间别名 159
8.2.8名字空间组合 160
8.2.9名字空问和老代码 163
8.3异常 166
8.3.1抛出和捕捉 167
8.3.2异常的辨识 168
8.3.3在计算器中的异常 169
8.4忠告 173
8.5练习 173
第9章 源文件和程序 175
9.1分别编译 175
9.2连接 176
9.2.1头文件 178
9.2.2标准库头文件 179
9.2.3单一定义规则 180
9.2.4与非C++代码的连接 182
9.2.5连接与指向函数的指针 184
9.3使用头文件 184
9.3.1单一头文件 184
9.3.2多个头文件 187
9.3.3包含保护符 191
9.4程序 192
9.4.1非局部变量的初始化 192
9.5忠告 194
9.6练习 194
第二部分 抽象机制 199
第10章 类 199
10.1引言 199
10.2类 199
10.2.1成员函数 200
10.2.2访问控制 201
10.2.3构造函数 202
10.2.4静态成员 203
10.2.5类对象的复制 204
10.2.6常量成员函数 205
10.2.7自引用 205
10.2.8结构和类 208
10.2.9在类内部的函数定义 210
10.3高效的用户定义类型 210
10.3.1成员函数 212
10.3.2协助函数 214
10.3.3重载的运算符 215
10.3.4具体类型的意义 215
10.4对象 216
10.4.1析构函数 216
10.4.2默认构造函数 217
10.4.3构造和析构 218
10.4.4局部变量 218
10.4.5自由存储 220
10.4.6类对象作为成员 221
10.4.7数组 223
10.4.8局部静态存储 224
10.4.9非局部存储 225
10.4.10临时对象 226
10.4.11对象的放置 228
10.4.12联合 229
10.5忠告 230
10.6练习 230
第11章 运算符重载 233
11.1引言 233
11.2运算符函数 234
11.2.1二元和一元运算符 235
11.2.2运算符的预定义意义 236
11.2.3运算符和用户定义类型 236
11.2.4名字空问里的运算符 237
11.3一个复数类型 238
11.3.1成员运算符和非成员运算符 238
11.3.2混合模式算术 239
11.3.3初始化 240
11.3.4复制 241
11.3.5构造函数和转换 242
11.3.6文字量 243
11.3.7另一些成员函数 243
11.3.8协助函数 244
11.4转换运算符 245
11.4.1歧义性 246
11.5友元 248
11.5.1友元的寻找 249
11.5.2友元和成员 250
11.6大型对象 251
11.7基本运算符 253
11.7.1显式构造函数 253
11.8下标 255
11.9函数调用 256
11.10间接 257
11.11增量和减量 259
11.12一个字符串类 260
11.13忠告 265
11.14练习 265
第12章 派生类 268
12.1引言 268
12.2派生类 269
12.2.1成员函数 271
12.2.2构造函数和析构函数 272
12.2.3复制 273
12.2.4类层次结构 273
12.2.5类型域 274
12.2.6虚函数 276
12.3抽象类 278
12.4类层次结构的设计 280
12.4.1一个传统的层次结构 280
12.4.2抽象类 283
12.4.3其他实现方式 285
12.4.4对象创建的局部化 287
12.5类层次结构和抽象类 289
12.6忠告 289
12.7练习 289
第13章 模板 292
13.1引言 292
13.2一个简单的String模板 293
13.2.1定义一个模板 294
13.2.2模板实例化 295
13.2.3模板参数 296
13.2.4类型等价 296
13.2.5类型检查 297
13.3函数模板 298
13.3.1函数模板的参数 299
13.3.2函数模板的重载 300
13.4用模板参数描述策略 302
13.4.1默认模板参数 303
13.5专门化 304
13.5.1专门化的顺序 306
13.5.2模板函数的专门化 307
13.6派生和模板 308
13.6.1参数化和继承 309
13.6.2成员模板 310
13.6.3继承关系 311
13.7源代码组织 312
13.8忠告 314
13.9练习 314
第14章 异常处理 316
14.1错误处理 316
14.1.1关于异常的其他观点 318
14.2异常的结组 318
14.2.1派生的异常 319
14.2.2多个异常的组合 321
14.3捕捉异常 321
14.3.1重新抛出 322
14.3.2捕捉所有异常 322
14.4资源管理 324
14.4.1构造函数和析构函数的使用 325
14.4.2 auto_ptr 326
14.4.3告诫 328
14.4.4异常和new 328
14.4.5资源耗尽 329
14.4.6构造函数里的异常 331
14.4.7析构函数里的异常 332
14.5不是错误的异常 333
14.6异常的描述 334
14.6.1对异常描述的检查 335
14.6.2未预期的异常 336
14.6.3异常的映射 336
14.7未捕捉的异常 338
14.8异常和效率 339
14.9处理错误的其他方式 340
14.10标准异常 342
14.11忠告 344
14.12练习 344
第15章 类层次结构 346
15.1引言和概述 346
15.2多重继承 346
15.2.1歧义性解析 348
15.2.2继承和使用声明 349
15.2.3重复的基类 350
15.2.4虚基类 352
15.2.5使用多重继承 354
15.3访问控制 357
15.3.1保护成员 359
15.3.2对基类的访问 360
15.4运行时类型信息 361
15.4.1 dynamic_cast 363
15.4.2在类层次结构中漫游 365
15.4.3类对象的构造与析构 367
15.4.4 typeid和扩展的类型信息 368
15.4.5 RTTI的使用和误用 370
15.5指向成员的指针 371
15.5.1基类和派生类 373
15.6自由存储 374
15.6.1数组分配 375
15.6.2虚构造函数 376
15.7忠告 377
15.8练习 377
第三部分 标准库 381
第16章 库组织和容器 381
16.1标准库的设计 381
16.1.1设计约束 382
16.1.2标准库组织 383
16.1.3语言支持 385
16.2容器设计 386
16.2.1专门化的容器和迭代器 386
16.2.2有基类的容器 388
16.2.3 STL容器 391
16.3向量 392
16.3.1类型 393
16.3.2迭代器 394
16.3.3元素访问 395
16.3.4构造函数 396
16.3.5堆栈操作 399
16.3.6表操作 401
16.3.7元素定位 403
16.3.8大小和容量 404
16.3.9其他成员函数 406
16.3.10协助函数 406
16.3.11 vector<bool> 407
16.4忠告 407
16.5练习 408
第17章 标准容器 409
17.1标准容器 409
17.1.1操作综述 409
17.1.2容器综述 412
17.1.3表示 413
17.1.4对元素的要求 413
17.2序列 416
17.2.1向量——vector 416
17.2.2表——list 416
17.2.3双端队列——deque 420
17.3序列适配器 421
17.3.1堆栈——stack 421
17.3.2队列——queue 422
17.3.3优先队列——priority_queue 423
17.4关联容器 425
17.4.1映射——map 425
17.4.2多重映射——multimap 433
17.4.3集合——set 434
17.4.4多重集合——multiset 435
17.5拟容器 435
17.5.1串——string 435
17.5.2值向量——valarray 435
17.5.3位集合——bitset 435
17.5.4内部数组 439
17.6定义新容器 439
17.6.1散列映射——hash_map 440
17.6.2表示和构造 441
17.6.3其他散列关联容器 446
17.7忠告 446
17.8练习 446
第18章 算法和函数对象 449
18.1引言 449
18.2标准库算法综述 449
18.3序列和容器 453
18.3.1输入序列 453
18.4函数对象 454
18.4.1函数对象的基类 456
18.4.2谓词 456
18.4.3算术函数对象 458
18.4.4约束器、适配器和否定器 458
18.5非修改性序列算法 463
18.5.1对每个做——for_each 463
18.5.2查找族函数 464
18.5.3计数 465
18.5.4相等和不匹配 466
18.5.5搜索 467
18.6修改性序列算法 467
18.6.1复制 468
18.6.2变换 469
18.6.3惟一化 471
18.6.4取代 473
18.6.5删除 474
18.6.6填充和生成 474
18.6.7反转和旋转 475
18.6.8交换 476
18.7排序的序列 476
18.7.1排序 476
18.7.2二分检索 477
18.7.3归并 478
18.7.4划分 479
18.7.5序列上的集合运算 479
18.8堆 480
18.9最小和最大 481
18.10排列 482
18.11 C风格算法 482
18.12忠告 483
18.13练习 483
第19章 迭代器和分配器 485
19.1引言 485
19.2迭代器和序列 485
19.2.1迭代器的操作 486
19.2.2迭代器特征类——iterator_lraits 487
19.2.3迭代器类别 488
19.2.4插入器 490
19.2.5反向迭代器 491
19.2.6流迭代器 492
19.3带检查迭代器 495
19.3.1异常、容器和算法 499
19.4分配器 500
19.4.1标准分配器 500
19.4.2一个用户定义分配器 503
19.4.3广义的分配器 505
19.4.4未初始化的存储 506
19.4.5动态存储 508
19.4.6 C风格的分配 509
19.5忠告 510
19.6练习 510
第20章 串 511
20.1引言 511
20.2字符 511
20.2.1字符特征类——char _traits 512
20.3基础串类——basic string 513
20.3.1类型 514
20.3.2迭代器 515
20.3.3元素访问 516
20.3.4构造函数 516
20.3.5错误 517
20.3.6赋值 518
20.3.7到C风格字符串的转换 519
20.3.8比较 521
20.3.9插入 522
20.3.10拼接 523
20.3.11查找 524
20.3.12替换 525
20.3.13子串 526
20.3.14大小和容量 527
20.3.15 I/O操作 527
20.3.16交换 528
20.4 C标准库 528
20.4.1 C风格字符串 528
20.4.2字符分类 530
20.5忠告 530
20.6练习 531
第21章 流 533
21.1引言 533
21.2输出 534
21.2.1输出流 535
21.2.2内部类型的输出 536
21.2.3用户定义类型的输出 538
21.3输入 540
21.3.1输入流 540
21.3.2内部类型的输入 540
21.3.3流状态 542
21.3.4字符的输入 544
21.3.5用户定义类型的输入 546
21.3.6异常 547
21.3.7流的联结 548
21.3.8哨位 549
21.4格式化 550
21.4.1格式状态 550
21.4.2整数输出 552
21.4.3浮点数输出 552
21.4.4输出域 553
21.4.5域的调整 555
21.4.6操控符 555
21.5文件流与字符串流 560
21.5.1文件流 561
21.5.2流的关闭 562
21.5.3字符串流 563
21.6缓冲 564
21.6.1输出流和缓冲区 565
21.6.2输入流和缓冲区 566
21.6.3流和缓冲区 567
21.6.4流缓冲区 567
21.7现场 571
21.7.1流回调 572
21.8 C输入/输出 573
21.9忠告 575
21.10练习 576
第22章 数值 578
22.1引言 578
22.2数值的限制 578
22.2.1表示限制的宏 580
22.3标准数学函数 580
22.4向量算术 582
22.4.1 valarray的构造 582
22.4.2 valarray的下标和赋值 583
22.4.3成员操作 584
22.4.4非成员函数 586
22.4.5切割 587
22.4.6切割数组——slice_ array 589
22.4.7临时量、复制和循环 593
22.4.8广义切割 595
22.4.9屏蔽 596
22.4.10间接数组——indirect array 596
22.5复数算术 597
22.6通用数值算法 599
22.6.1累积——accumulate 599
22.6.2内积——inner_product 600
22.6.3增量变化 600
22.7随机数 602
22.8忠告 603
22.9练习 603
第四部分 用C+做设计 607
第23章 开发和设计 607
23.1概述 607
23.2引言 607
23.3目的与手段 609
23.4开发过程 611
23.4.1开发循环 613
23.4.2设计目标 615
23.4.3设计步骤 616
23.4.4试验和分析 623
23.4.5测试 625
23.4.6软件维护 625
23.4.7效率 626
23.5管理 626
23.5.1重用 627
23.5.2规模 628
23.5.3个人 629
23.5.4混成设计 630
23.6带标注的参考文献 631
23.7忠告 633
第24章 设计和编程 635
24.1概述 635
24.2设计和程序设计语言 635
24.2.1忽视类 637
24.2.2忽视继承 638
24.2.3忽视静态类型检查 638
24.2.4忽视程序设计 641
24.2.5排他性地使用类层次结构 642
24.3类 643
24.3.1类表示什么 643
24.3.2类层次结构 644
24.3.3包容关系 648
24.3.4包容和继承 649
24.3.5使用关系 653
24.3.6编入程序里的关系 654
24.3.7类内的关系 656
24.4组件 661
24.4.1模板 663
24.4.2界面和实现 665
24.4.3肥大的界面 667
24.5忠告 668
第25章 类的作用 670
25.1类的种类 670
25.2具体类型 672
25.2.1具体类型的重用 672
25.3抽象类型 674
25.4结点 676
25.4.1修改界面 677
25.5动作 680
25.6界面类 681
25.6.1调整界面 683
25.7句柄类 684
25.7.1句柄上的操作 687
25.8应用框架 688
25.9忠告 689
25.10练习 690
附录和索引 695
附录A语法 695
附录B兼容性 713
附录C技术细节 724
附录D现场 759
附录E标准库的异常时安全性 815
索引 845