因为看不懂重新开始了
第一页是封面
前言
本书全面介绍了 C++ 语言。作为一本入门书(Primer),它以教程的形式
对 C++ 语言进行清晰的讲解,并辅以丰富的示例和各种学习辅助手段。与大多
数入门教程不同,本书对 C++ 语言本身进行了详尽的描述,并特别着重介绍了
目前通行的、行之有效的程序设计技巧。
无数程序员曾使用本书的前几个版本学习 C++,在此期间 C++ 也逐渐发展
成熟。这些年来,C++ 语言的发展方向以及 C++ 程序员的关注点,已经从以往
注重运行时的效率,转到千方百计地提高程序员的编程效率上。随着标准库的广
泛可用,我们现在能够比以往任何时候更高效地学习和使用 C++。本书这一版本
充分体现了这一点。
第四版的改动
为了体现现代 C++ 编程风格,我们重新组织并重写了本书。书中不再强调
低层编程技术,而把中心转向标准库的使用。书中很早就开始介绍标准库,示例
也已经重新改写,充分利用了标准库设施。我们也对语言主题叙述的先后次序进
行了重新编排,使讲解更加流畅。
除重新组织内容外,为了便于读者理解,我们还增加了几个新的环节。每一
章都新增了“小结”和“术语”,概括本章要点。读者可以利用这些部分进行自
我检查;如果发现还有不理解的概念,可以重新学习该章中的相关部分。
书中还加入了下述几种学习辅助手段:
• 重要术语用黑体表示,我们认为读者已经熟悉的重要术语则用楷体表示。
这些术语都会出现在的“术语”部分。
• 书中用特殊版式突出标注的文字,是为了向读者提醒语言的重要特征,警
示常见的错误,标明良好的编程实践,列出通用的使用技巧。希望这些标
注可以帮助读者更快地消化重要概念,避免犯常见错误。
• 为了更易于理解各种特征或概念间的关系,书中大量使用了前后交叉引
用。
• 对于某些重要概念和 C++ 新手最头疼的问题,我们进行了额外的讨论和
解释。这部分也以特殊版式标出。
• 学习任何程序设计语言都需要编写程序。因此,本提供了大量的示例。所
有示例的源代码可以从下列网址获得:
• http://www.awprofessional.com/cpp_primer
万变不离其宗,本书保持了前几版的特色,仍然是一部全面介绍 C++ 的教程。
我们的目标是提供一本清晰、全面、准确的指南性读物。我们通过讲解一系列示
例来教授 C++ 语言,示例除了解释语言特征外,还展示了如何善用这门语言。
2页
虽然读者不需要事先学过 C 语言(C++ 最初的基础)的知识,但我们假定读者
已经掌握了一种现代结构化语言。
本书结构
本介绍了 C++ 国际标准,既涵盖语言的特征,又讲述了也是标准组成部分
的丰富标准库。C++ 的强大很大程度上来自它支持抽象程序设计。要学会用 C++
高效地编程,只是掌握句法和语义是远远不够的。我们的重点在于,教会读者怎
样利用 C++ 的特性,快速地写出安全的而且性能可与 C 语言低层程序相媲美的
程序。
C++ 是一种大型的编程语言,这可能会吓倒一些新手。现代 C++ 可以看成由
以下三部分组成:
• 低级语言,多半继承自 C。
• 更高级的语言特征,用户可以借此定义自己的数据类型,组织大规模的程
序和系统。
• 标准库,使用上述高级特征提供一整套有用的数据结构和算法。
多数 C++ 教材按照下面的顺序展开:先讲低级细节,再介绍更高级的语言特
征;在讲完整个语言后才开始解释标准库。结果往往使读者纠缠于低级的程序设
计问题和复杂类型定义的编写等细节,而不能真正领会抽象编程的强大,更不用
说学到足够的知识去创建自己的抽象了。
本版中我们独辟蹊径。一开始就讲述语言的基础知识和标准库,这样读者就
可以写出比较大的有实际意义的程序来。透彻阐释了使用标准库(并且用标准库
编写了各种抽象程序)的基础知识之后,我们才进入下一步,学习用 C++ 的其
他高级特征来编写自己的抽象。
第一和第二部分讨论语言的基础知识和标准库设施。其重点在于学会如何编
写 C++ 程序,如何使用标准库提供的抽象设施。大部分 C++ 程序员需要了解本
书这两部分的内容。
除了讲解基础知识以外,这两部分还有另外一个重要的意图。标准库设施本
身是用 C++ 编写的抽象数据类型,定义标准库使用的是任何 C++ 程序员都能使
用的构造类的语言特征。我们教授 C++ 的经验说明,一开始就使用设计良好的
抽象类型,读者会更容易理解如何建立自己的类型。
第三到第五部分着重讨论如何编写自己的类型。第三部分介绍 C++ 的核心,
即对对类的支持。类机制提供了编写自定义抽象的基础。类也是第四部分中讨论的
面向对象编程和泛型编程的基础。全书正文的最后是第五部分,这一部分讨论了
一些高级特征,它们在构建大型复杂系统时最为常用。
3页
致谢
与前几版一新,我们要感谢 Bjarne Stroustrup,他不知疲倦地从事着 C++
方面的工作,他与我们的深厚友情由来已久。我们还要感谢 Alex Stepanov,正
是他最初凭借敏锐的洞察力创造了容器和算法的概念,这些概念最终形成了标准
库的核心。此外,我们要感谢 C++ 标准委员会的所有成员,他们多年来为 C++ 澄
清概念、细化标准和改进功能付出了艰苦的努力。
我们要衷心地感谢本书审稿人,他们审阅了我们的多份书稿,帮助我们对本
书进行了无数大大小小的修改。他们是 Paul Abrahams,Michael Ball,Mary
Dageforde,Paul DuBois,Matt Greenwood,Matthew P. Johnson,Andrew Koenig,
Nevin Liber,Bill Locke,Robert Murray,Phil Romanik,Justin Shaw,Victor
Shtern,Clovis Tondo,Daveed Vandevoorde 和 Steve Vinoski。
书中所有示例都已通过 GNU 和微软编译器的编译。感谢他们的开发者和所
有开发其他 C++ 编译器的人,是他们使 C++ 变成现实。
最后,感谢 的工作人员,他们引领了这一版的整个出版过程:——我们最
初的编辑,是他提出出版本书的新版,他从本书最初版本起就一直致力于本书;
——我们的新编辑,他坚持更新和精简本书内容,极大地改进了这一版本;——
他保证了我们所有人能按进度工作;还有 、、和,他们和我们一起经历了整个设计和制作过程。
4页
目录
前言 ..................................................................................................................................................1
第四版的改动...........................................................................................................................2
本书结构...................................................................................................................................3
致谢...........................................................................................................................................4
第一章快速入门...........................................................................................................................17
1.1. 编写简单的 C++ 程序..........................................................................................17
调用 GNU 或微软编译器....................................................................................................20
Exercises Section 1.1.1 ...........................................................................................................21
1.2. 初窥输入/输出........................................................................................................21
关键概念:已初始化变量和未初始化变量.........................................................................26
Exercises Section 1.2.2 ...........................................................................................................27
1.3. 关于注释.................................................................................................................27
Exercises Section 1.3 ......................................................................................................29
1.4. 控制结构.................................................................................................................29
关键概念:C++ 程序的缩排和格式....................................................................................31
再谈编译.................................................................................................................................34
Exercises Section 1.4.2 ...........................................................................................................35
Exercises Section 1.4.3 ...........................................................................................................37
从键盘输入文件结束符.........................................................................................................39
Exercises Section 1.4.4 ...........................................................................................................39
1.5. 类的简介.................................................................................................................39
关键概念:类定义行为.........................................................................................................42
Exercises Section 1.5.1 ...........................................................................................................43
Exercises Section 1.5.2 ...........................................................................................................45
1.6. C++ 程序................................................................................................................45
Exercises Section 1.6 ..............................................................................................................47
小结.................................................................................................................................47
术语.................................................................................................................................47
第一部分基本语言.......................................................................................................................54
第二章变量和基本类型.......................................................................................................55
2.1. 基本内置类型.........................................................................................................55
内置类型的机器级表示.........................................................................................................57
建议:使用内置算术类型.....................................................................................................60
Exercises Section 2.1.2 ...........................................................................................................61
2.2. 字面值常量.............................................................................................................61
建议:不要依赖未定义行为.................................................................................................66
Exercises Section 2.2 ..............................................................................................................67
2.3. 变量.........................................................................................................................67
Exercises Section 2.3 ..............................................................................................................68
关键概念:强静态类型.........................................................................................................69
Exercises Section 2.3.1 ...........................................................................................................70
5页
术语:什么是对象?.............................................................................................................71
Exercises Section 2.3.2 ...........................................................................................................73
Exercises Section 2.3.3 ...........................................................................................................77
警告:未初始化的变量引起运行问题.................................................................................78
Exercises Section 2.3.4 ...........................................................................................................79
Exercises Section 2.3.5 ...........................................................................................................81
Exercises Section 2.3.6 ...........................................................................................................84
2.4. const 限定符...........................................................................................................84
Exercises Section 2.4 ..............................................................................................................87
2.5. 引用.........................................................................................................................87
术语:const 引用是指向 const 的引用...........................................................................89
Exercises Section 2.5 ..............................................................................................................90
2.6. typedef 名字............................................................................................................90
2.7. 枚举.........................................................................................................................91
2.8. 类类型.....................................................................................................................93
Exercises Section 2.8 ..............................................................................................................97
2.9. 编写自己的头文件.................................................................................................97
编译和链接多个源文件.........................................................................................................99
Exercises Section 2.9.1 .........................................................................................................102
小结...............................................................................................................................104
术语...............................................................................................................................105
第三章标准库类型.............................................................................................................112
3.1. 命名空间的 using 声明........................................................................................112
Exercises Section 3.1 ............................................................................................................115
Exercises Section 3.1 ............................................................................................................115
3.2. 标准库 string 类型................................................................................................115
警告:标准库string 类型和字符串字面值.....................................................................116
Exercises Section 3.2.1 .........................................................................................................116
Exercises Section 3.2.2 .........................................................................................................119
建议:采用 C 标准库头文件的 C++ 版本.........................................................................127
Exercises Section 3.2.4 .........................................................................................................127
3.3. 标准库 vector 类型.............................................................................................127
关键概念:vector 对象动态增长.....................................................................................130
Exercises Section 3.3.1 .........................................................................................................131
关键概念:安全的泛型编程...............................................................................................134
警告:仅能对确知已存在的元素进行下标操作...............................................................135
Exercises Section 3.3.2 .........................................................................................................136
3.4. 迭代器简介...........................................................................................................136
术语:迭代器和迭代器类型...............................................................................................137
Exercises Section 3.4 ............................................................................................................142
Exercises Section 3.4.1 .........................................................................................................143
3.5. 标准库 bitset .........................................................................................................143
Exercises Section 3.5.2 .........................................................................................................150
小结...............................................................................................................................150
术语...............................................................................................................................
6页
第四章数组和指针.............................................................................................................155
4.1. 数组.......................................................................................................................155
警告:数组的长度是固定的...............................................................................................159
Exercises Section 4.1.1 .........................................................................................................160
Exercises Section 4.1.2 .........................................................................................................162
4.2. 指针的引入...........................................................................................................162
建议:尽量避免使用指针和数组.......................................................................................163
Exercises Section 4.2.2 .........................................................................................................169
关键概念:给指针赋值或通过指针进行赋值...................................................................170
Exercises Section 4.2.3 .........................................................................................................172
Exercises Section 4.2.4 .........................................................................................................177
建议:理解复杂的const 类型的声明.............................................................................180
Exercises Section 4.3 ............................................................................................................182
4.3. C 风格字符串.......................................................................................................182
Exercises Section 4.3 ............................................................................................................188
C 风格字符串与 C++ 的标准库类型string 的比较...................................................192
Exercises Section 4.3.1 .........................................................................................................194
Exercises Section 4.3.2 .........................................................................................................196
4.4. 多维数组...............................................................................................................196
Exercises Section 4.4.1 .........................................................................................................200
小结...............................................................................................................................200
术语...............................................................................................................................200
第五章表达式.....................................................................................................................204
5.1. 算术操作符...........................................................................................................205
警告:溢出和其他算术异常...............................................................................................207
Exercises Section 5.1 ............................................................................................................209
5.2. 关系操作符和逻辑操作符...................................................................................209
Exercises Section 5.2 ............................................................................................................213
5.3. 位操作符...............................................................................................................213
Exercises Section 5.3.1 .........................................................................................................217
5.4. 赋值操作符...........................................................................................................218
Exercises Section 5.4.2 .........................................................................................................221
Exercises Section 5.4.3 .........................................................................................................222
5.5. 自增和自减操作符...............................................................................................222
建议:只有在必要时才使用后置操作符...........................................................................223
建议:简洁即是美...............................................................................................................224
Exercises Section 5.5 ............................................................................................................225
5.6. 箭头操作符...........................................................................................................225
Exercises Section 5.6 ............................................................................................................226
5.7. 条件操作符...........................................................................................................226
Exercises Section 5.7 ............................................................................................................228
5.8. sizeof 操作符........................................................................................................228
Exercises Section 5.8 ............................................................................................................229
5.9. 逗号操作符...........................................................................................................229
7页
Exercises Section 5.9 ............................................................................................................230
5.10. 复合表达式的求值.............................................................................................230
Exercises Section 5.10.2 .......................................................................................................236
建议:复合表达式的处理...................................................................................................238
Exercises Section 5.10.3 .......................................................................................................239
5.11. new 和 delete 表达式........................................................................................239
警告:动态内存的管理容易出错.......................................................................................243
Exercises Section 5.11 ..........................................................................................................244
5.12. 类型转换.............................................................................................................244
Exercises Section 5.12.3 .......................................................................................................250
建议:避免使用强制类型转换...........................................................................................253
Exercises Section 5.12.7 .......................................................................................................255
小结...............................................................................................................................255
术语...............................................................................................................................256
第六章语句.........................................................................................................................261
6.1. 简单语句...............................................................................................................261
6.2. 声明语句...............................................................................................................262
6.3. 复合语句(块)...................................................................................................263
Exercises Section 6.3 ............................................................................................................264
6.4. 语句作用域.........................................................................................................264
6.5. if 语句...................................................................................................................265
Exercises Section 6.5.1 .........................................................................................................270
6.6. switch 语句...........................................................................................................270
Exercises Section 6.6.5 .........................................................................................................278
Code for Exercises in Section 6.6.5 ......................................................................................278
6.7. while 语句.............................................................................................................279
Exercises Section 6.7 ............................................................................................................282
6.8. for 循环语句.........................................................................................................282
Exercises Section 6.8.2 .........................................................................................................286
6.9. do while 语句........................................................................................................286
Exercises Section 6.9 ............................................................................................................289
6.10. break 语句...........................................................................................................289
Exercises Section 6.10 ..........................................................................................................291
6.11. continue 语句......................................................................................................291
Exercises Section 6.11 ..........................................................................................................292
6.12. goto 语句.............................................................................................................292
Exercises Section 6.13.2 .......................................................................................................297
6.14. 使用预处理器进行调试.....................................................................................299
Exercises Section 6.14 ..........................................................................................................301
小结...............................................................................................................................301
术语...............................................................................................................................302
第七章函数.........................................................................................................................306
Exercises Section 6.12 ..........................................................................................................293
6.13. try 块和异常处理...............................................................................................293
8Exercises Section 6.13.2 .......................................................................................................297
6.14. 使用预处理器进行调试.....................................................................................299
Exercises Section 6.14 ..........................................................................................................301
小结...............................................................................................................................301
术语...............................................................................................................................302
第七章函数.........................................................................................................................306
8页
7.1. 函数的定义...........................................................................................................306
Exercises Section 7.1.2 .........................................................................................................311
7.2. 参数传递...............................................................................................................311
Exercises Section 7.2.1 .........................................................................................................314
Exercises Section 7.2.2 .........................................................................................................321
Exercises Section 7.2.5 .........................................................................................................328
Exercises Section 7.2.6 .........................................................................................................329
7.3. return 语句............................................................................................................330
Exercises Section 7.3.2 .........................................................................................................337
Exercises Section 7.3.3 .........................................................................................................339
7.4. 函数声明...............................................................................................................339
Exercises Section 7.4 ............................................................................................................341
Exercises Section 7.4.1 .........................................................................................................344
7.5. 局部对象...............................................................................................................344
Exercises Section 7.5.2 .........................................................................................................346
7.6. 内联函数...............................................................................................................346
Exercises Section 7.6 ............................................................................................................348
7.7. 类的成员函数.......................................................................................................348
Exercises Section 7.7.4 .........................................................................................................356
7.8. 重载函数...............................................................................................................356
建议:何时不重载函数名...................................................................................................359
Exercises Section 7.8.1 .........................................................................................................362
Exercises Section 7.8.3 .........................................................................................................366
Exercises Section 7.8.4 .........................................................................................................370
7.9. 指向函数的指针...................................................................................................370
小结...............................................................................................................................374
术语...............................................................................................................................375
第八章标准 IO 库............................................................................................................379
8.1. 面向对象的标准库...............................................................................................379
Exercises Section 8.1 ............................................................................................................383
8.2. 条件状态...............................................................................................................383
Exercises Section 8.2 ............................................................................................................387
8.3. 输出缓冲区的管理...............................................................................................387
警告:如果程序崩溃了,则不会刷新缓冲区...................................................................388
8.4. 文件的输入和输出...............................................................................................389
警告:C++ 中的文件名......................................................................................................391
Exercises Section 8.4.1 .........................................................................................................394
Exercises Section 8.4.3 .........................................................................................................398
8.5. 字符串流...............................................................................................................398
Exercises Section 8.5 ............................................................................................................401
小结...............................................................................................................................401
术语...............................................................................................................................401
第二部分:容器和算法...............................................................................................................403
第九章. 顺序容器................................................................................................................404
9页
9.1. 顺序容器的定义...................................................................................................405
Exercises Section 9.1.1 .........................................................................................................409
Exercises Section 9.1.2 .........................................................................................................411
9.2. 迭代器和迭代器范围...........................................................................................411
Exercises Section 9.2 ............................................................................................................414
对形成迭代器范围的迭代器的要求...................................................................................415
Exercises Section 9.2.1 .........................................................................................................417
9.3. 每种顺序容器都提供了一组有用的类型定义以及以下操作: .......................418
Exercises Section 9.3.1 .........................................................................................................419
关键概念:容器元素都是副本...........................................................................................421
Exercises Section 9.3.3 .........................................................................................................425
Exercises Section 9.3.4 .........................................................................................................427
Exercises Section 9.3.5 .........................................................................................................429
Exercises Section 9.3.6 .........................................................................................................431
Exercises Section 9.3.7 .........................................................................................................434
Exercises Section 9.3.8 .........................................................................................................437
9.4. vector 容器的自增长............................................................................................437
Exercises Section 9.4.1 .........................................................................................................441
9.5. 容器的选用...........................................................................................................441
Exercises Section 9.5 ............................................................................................................444
9.6. 再谈 string 类型.............................................................................................444
Exercises Section 9.6 ....................................................................................................446
Exercises Section 9.6.4 ................................................................................................456
9.7. 容器适配器.........................................................................................................459
Exercises Section 9.7.2 ................................................................................................463
小结...............................................................................................................................463
术语...............................................................................................................................463
第十章 关联容器.................................................................................................................466
10.1. 引言:pair 类型.............................................................................................466
Exercises Section 10.1 ..................................................................................................469
10.2. 关联容器...........................................................................................................469
Exercises Section 10.2 ..................................................................................................470
10.3. map 类型...........................................................................................................470
Exercises Section 10.3.1 ..............................................................................................472
Exercises Section 10.3.2 ..............................................................................................473
Exercises Section 10.3.4 ..............................................................................................475
Exercises Section 10.3.5 ..............................................................................................479
Exercises Section 10.3.6 ..............................................................................................480
Exercises Section 10.3.9 ..............................................................................................485
10.4. set 类型...........................................................................................................485
Exercises Section 10.4 ..................................................................................................486
Exercises Section 10.4.2 ..............................................................................................489
10.5. multimap 和 multiset 类型........................................................................490
Exercises Section 10.5.2 ..............................................................................................494
10页
10.6. 容器的综合应用:文本查询程序...................................................................495
Exercises Section 10.6.2 ..............................................................................................498
Exercises Section 10.6.3 ..............................................................................................501
Exercises Section 10.6.4 ..............................................................................................503
小结...............................................................................................................................503
术语...............................................................................................................................504
第十一章 泛型算法.............................................................................................................506
11.1. 概述...................................................................................................................506
Exercises Section 11.1 ..................................................................................................509
关键概念:算法永不执行容器提供的操作.......................................................................509
11.2. 初窥算法...........................................................................................................510
关键概念:迭代器实参类型...............................................................................................512
Exercises Section 11.2.1 ..............................................................................................512
Exercises Section 11.2.2 ..............................................................................................515
Exercises Section 11.2.3 ..............................................................................................521
11.3. 再谈迭代器.......................................................................................................521
Exercises Section 11.3.1 ..............................................................................................523
Exercises Section 11.3.2 ..............................................................................................529
Exercises Section 11.3.3 ..............................................................................................532
关键概念:关联容器与算法...............................................................................................534
Exercises Section 11.3.5 ..............................................................................................535
11.4. 泛型算法的结构...............................................................................................536
Exercises Section 11.4.2 ..............................................................................................539
11.5. 容器特有的算法...............................................................................................539
Exercises Section 11.5 ..................................................................................................541
Exercises Section 11.5 ..................................................................................................541
小结...............................................................................................................................541
术语...............................................................................................................................542
第三部分:类和数据抽象...........................................................................................................545
第十二章 类.........................................................................................................................546
12.1. 类的定义和声明...............................................................................................546
Exercises Section 12.1.1 ..............................................................................................548
建议:具体类型和抽象类型...............................................................................................549
关键概念:数据抽象和封装的好处...................................................................................551
Exercises Section 12.1.2 ..............................................................................................551
Exercises Section 12.1.3 ..............................................................................................555
Exercises Section 12.1.4 ..............................................................................................557
12.2. 隐含的 this 指针...........................................................................................558
建议:用于公共代码的私有实用函数...............................................................................562
Exercises Section 12.2 ..................................................................................................563
12.3. 类作用域...........................................................................................................563
Exercises Section 12.3 ..................................................................................................566
Exercises Section 12.3.1 ..............................................................................................571
12.4. 构造函数...........................................................................................................571
Exercises Section 12.4 ..................................................................................................573
11页
建议:使用构造函数初始化列表.......................................................................................577
Exercises Section 12.4.1 ..............................................................................................579
Exercises Section 12.4.2 ..............................................................................................580
Exercises Section 12.4.3 ..............................................................................................583
Exercises Section 12.4.4 ..............................................................................................586
Exercises Section 12.4.5 ..............................................................................................588
12.5. 友元...................................................................................................................588
Exercises Section 12.5 ..................................................................................................591
12.6. static 类成员................................................................................................591
Exercises Section 12.6 ..................................................................................................593
Exercises Section 12.6.1 ..............................................................................................594
Exercises Section 12.6.2 ..............................................................................................597
小结...............................................................................................................................597
术语...............................................................................................................................598
第十三章 复制控制.............................................................................................................601
13.1. 复制构造函数...................................................................................................602
Exercises Section 13.1 ..................................................................................................604
Exercises Section 13.1.2 ..............................................................................................607
13.2. 赋值操作符.......................................................................................................608
Exercises Section 13.2 ..................................................................................................610
13.3. 析构函数...........................................................................................................611
Exercises Section 13.3 ..................................................................................................613
13.4. 消息处理示例...................................................................................................614
Exercises Section 13.4 ..................................................................................................620
13.5. 管理指针成员...................................................................................................620
Exercises Section 13.5 ..................................................................................................623
建议:管理指针成员...........................................................................................................628
Exercises Section 13.5.1 ..............................................................................................629
Exercises Section 13.5.2 ..............................................................................................631
小结...............................................................................................................................632
术语...............................................................................................................................632
第十四章 重载操作符与转换.............................................................................................635
14.1. 重载操作符的定义.............................................................................................635
习题 14.1..............................................................................................................................640
警告:审慎使用操作符重载...............................................................................................642
Exercises Section 14.1.1 .......................................................................................................643
14.2. 输入和输出操作符.............................................................................................643
Exercises Section 14.2.1 .......................................................................................................646
Exercises Section 14.2.2 ..............................................................................................649
14.3. 算术操作符和关系操作符.................................................................................649
Exercises Section 14.3 ..........................................................................................................651
14.4. 赋值操作符.........................................................................................................652
Exercises Section 14.4 ..........................................................................................................654
14.5. 下标操作符.........................................................................................................654
12页
Exercises Section 14.5 ..........................................................................................................656
14.6. 成员访问操作符.................................................................................................656
Exercises Section 14.6 ..........................................................................................................660
14.7. 自增操作符和自减操作符.................................................................................660
Exercises Section 14.7 ..........................................................................................................665
14.8. 调用操作符和函数对象.....................................................................................665
Exercises Section 14.8 ..........................................................................................................666
Exercises Section 14.8.1 .......................................................................................................669
Exercises Section 14.8.3 ..............................................................................................672
14.9. 转换与类类型.....................................................................................................673
Exercises Section 14.9.2 .......................................................................................................679
警告:避免转换函数的过度使用.......................................................................................684
Exercises Section 14.9.4 .......................................................................................................688
警告:转换和操作符...........................................................................................................690
Exercises Section 14.9.5 .......................................................................................................692
小结...............................................................................................................................692
术语...............................................................................................................................693
第四部分:面向对象编程与泛型编程.......................................................................................695
第十五章. 面向对象编程...................................................................................................696
15.1. 面向对象编程:概述.........................................................................................696
15.2. 定义基类和派生类.............................................................................................698
Exercises Section 15.2.1 .......................................................................................................701
关键概念:类设计与受保护成员.......................................................................................702
Exercises Section 15.2.3 .......................................................................................................707
关键概念:C++ 中的多态性..............................................................................................710Exercises Section 15.2.4 .......................................................................................................713
关键概念:继承与组合.......................................................................................................716
Exercises Section 15.2.5 .......................................................................................................719
Exercises Section 15.2.7 .......................................................................................................721
15.3. 转换与继承.........................................................................................................721
15.4. 构造函数和复制控制.........................................................................................725
关键概念:重构...................................................................................................................729
关键概念:尊重基类接口...................................................................................................730
Exercises Section 15.4.2 .......................................................................................................731
Exercises Section 15.4.4 .......................................................................................................736
15.5. 继承情况下的类作用域.....................................................................................737
Exercises Section 15.5.1 .......................................................................................................738
Exercises Section 15.5.2 .......................................................................................................740
关键概念:名字查找与继承...............................................................................................743
Exercises Section 15.5.4 ..............................................................................................744
15.6. 纯虚函数.............................................................................................................745
Exercises Section 15.6 ..........................................................................................................746
15.7. 容器与继承.........................................................................................................746
Exercises Section 15.7 ..........................................................................................................747
13页
15.8. 句柄类与继承.....................................................................................................747
Exercises Section 15.8.2 .......................................................................................................753
Exercises Section 15.8.3 .......................................................................................................758
15.9. 再谈文本查询示例.............................................................................................758
Exercises Section 15.9.2 .......................................................................................................764
Exercises Section 15.9.5 .......................................................................................................772
Exercises Section 15.9.6 .......................................................................................................774
小结...............................................................................................................................774
术语...............................................................................................................................775
第十六章 模板和泛型编程.................................................................................................778
16.1. 模板定义.............................................................................................................778
Exercises Section 16.1.1 .......................................................................................................781
Exercises Section 16.1.2 .......................................................................................................783
Exercises Section 16.1.3 .......................................................................................................786
Exercises Section 16.1.4 .......................................................................................................789
Exercises Section 16.1.5 .......................................................................................................790
Exercises Section 16.1.6 .......................................................................................................792
警告:链接时的编译时错误...............................................................................................793
16.2. 实例化.................................................................................................................793
Exercises Section 16.2.1 .......................................................................................................801
Exercises Section 16.2.2 ..............................................................................................804
16.3. 模板编译模型.....................................................................................................804
Exercises Section 16.3 ..........................................................................................................807
警告:类模板中的名字查找...............................................................................................808
16.4. 类模板成员.........................................................................................................808
Exercises Section 16.4 ..........................................................................................................813
Exercises Section 16.4.1 .......................................................................................................818
Exercises Section 16.4.2 .......................................................................................................820
Exercises Section 16.4.4 .......................................................................................................826
Exercises Section 16.4.6 .......................................................................................................832
16.5. 一个泛型句柄类.................................................................................................833
Exercises Section 16.5.1 .......................................................................................................836
Exercises Section 16.5.2 .......................................................................................................839
16.6. 模板特化.............................................................................................................839
Exercises Section 16.6.1 .......................................................................................................843
Exercises Section 16.6.2 .......................................................................................................846
Exercises Section 16.6.3 .......................................................................................................848
16.7. 重载与函数模板.................................................................................................849
Exercises Section 16.7 ..........................................................................................................853
小结...............................................................................................................................853
术语...............................................................................................................................854
第五部分 高级主题...................................................................................................................857
第十七章 用于大型程序的工具.......................................................................................858
17.1. 异常处理.............................................................................................................858
14页
Exercises Section 17.1.1 .......................................................................................................862
Exercises Section 17.1.3 .......................................................................................................866
Exercises Section 17.1.5 .......................................................................................................869
Exercises Section 17.1.8 .......................................................................................................874
Exercises Section 17.1.9 .......................................................................................................881
警告:Auto_ptr 缺陷.........................................................................................................882
Exercises Section 17.1.11......................................................................................................888
17.2. 命名空间...........................................................................................................888
Exercises Section 17.2.1 ..............................................................................................894
Exercises Section 17.2.2 ..............................................................................................895
未命名的命名空间取代文件中的静态声明.......................................................................897
Exercises Section 17.2.3 ..............................................................................................897
Exercises Section 17.2.4 ..............................................................................................902
警告:避免 Using 指示.....................................................................................................903
Exercises Section 17.2.6 ..............................................................................................910
17.3. 多重继承与虚继承...........................................................................................911
Exercises Section 17.3.1 ..............................................................................................913
Exercises Section 17.3.2 ..............................................................................................915
Exercises Section 17.3.2 ..............................................................................................917
本节习题的代码...................................................................................................................920
Exercises Section 17.3.4 ..............................................................................................921
Exercises Section 17.3.6 ..............................................................................................926
Exercises Section 17.3.7 ..............................................................................................929
小结...............................................................................................................................930
术语...............................................................................................................................931
第十八章 特殊工具与技术.................................................................................................936
18.1. 优化内存分配...................................................................................................936
Exercises Section 18.1.2 ..............................................................................................942
术语对比:new 表达式与 operator new 函数..............................................................942
Exercises Section 18.1.4 ..............................................................................................945
Exercises Section 18.1.5 ..............................................................................................946
Exercises Section 18.1.6 ..............................................................................................949
Exercises Section 18.1.7 ..............................................................................................955
18.2. 运行时类型识别...............................................................................................956
Exercises Section 18.2.1 ..............................................................................................959
Exercises Section 18.2.2 ..............................................................................................961
Exercises Section 18.2.4 ..............................................................................................966
18.3. 类成员的指针...................................................................................................966
Exercises Section 18.3.1 ..............................................................................................969
Exercises Section 18.3.2 ..............................................................................................973
18.4. 嵌套类...............................................................................................................973
Exercises Section 18.4.2 ..............................................................................................979
18.5. 联合:节省空间的类.......................................................................................980
18.6. 局部类...............................................................................................................983
15页
18.7. 固有的不可移植的特征...................................................................................985
对链接到 C 的预处理器支持.............................................................................................992
Exercises Section 18.7.3 ..............................................................................................994
小结...............................................................................................................................994
术语...............................................................................................................................995
附录 A. 标准库..........................................................................................................................999
A.1. 标准库名字和头文件................................................................................................1000
A.2. 算法简介..................................................................................................................1003
A.2.1. 查找对象的算法...........................................................................................1003
A.2.2. 其他只读算法...............................................................................................1005
A.2.3. 二分查找算法...............................................................................................1006
A.2.4. 写容器元素的算法.......................................................................................1006
A.2.5. 划分与排序算法...........................................................................................1008
A.2.6. 通用重新排序操作.......................................................................................1010
A.2.7. 排列算法.......................................................................................................1012
A.2.8. 有序序列的集合算法...................................................................................1013
A.2.9. 最大值和最小值...........................................................................................1014
A.2.10. 算术算法.....................................................................................................1015
A.3. 再谈 IO 库..............................................................................................................1018
A.3.1. 格式状态.......................................................................................................1018
A.3.2. 许多操纵符改变格式状态...........................................................................1019
A.3.3. 控制输出格式...............................................................................................1020
A.3.4. 控制输入格式化...........................................................................................1027
A.3.5. 未格式化的输入/输出操作.......................................................................1027
A.3.6. 单字节操作...................................................................................................1028
A.3.7. 多字节操作...................................................................................................1029
警告:低级例程容易出错.................................................................................................1030
A.3.8. 流的随机访问...............................................................................................1031
A.3.9. 读写同一文件...............................................................................................1034
16页
第一章快速入门
本章介绍 C++ 的大部分基本要素:内置类型、库类型、类类型、变量、表
达式、语句和函数。在这一过程中还会简要说明如何编译和运行程序。
读者读完本章内容并做完练习,就应该可以编写、编译和执行简单的程序。
后面的章节会进一步阐明本章所介绍的主题。
要学会一门新的程序语言,必须实际动手编写程序。在这一章,我们将缩写
程序解决一个简单的数据处理问题:某书店以文件形式保存其每一笔交易。每一
笔交易记录某本书的销售情况,含有 ISBN(国际标准书号,世界上每种图书的
唯一标识符)、销售册数和销售单价。每一笔交易形如:
0-201-70353-X 4 24.99
第一个元素是 ISBN,第二个元素是销售的册数,最后是销售单价。店主定
期地查看这个文件,统计每本书的销售册数、总销售收入以及平均售价。我们要
编写程序来进行这些计算。
在编写这个程序之前,必须知道 C++ 的一些基本特征。至少我们要知道怎么
样编写、编译和执行简单的程序。这个程序要做什么呢?虽然还没有设计解决方
案,但是我们知道程序必须:
• 定义变量。
• 实现输入和输出。
• 定义数据结构来保存要处理的数据。
• 测试是否两条记录具有相同的 ISBN。
• 编写循环。处理交易文件中的每一条记录。
我们将首先考察 C++ 的这些部分,然后编写书店问题的解决方案。
1.1. 编写简单的 C++ 程序
每个 C++ 程序都包含一个或多个函数,而且必须有一个命名为 main。函数
由执行函数功能的语句序列组成。操作系统通过调用 main 函数来执行程序,
main 函数则执行组成自己的语句并返回一个值给操作系统。
下面是一个简单的 main 函数,它不执行任何功能,只是返回一个值:
int main()
{
return 0;
}
17页
操作系统通过 main 函数返回的值来确定程序是否成功执行完毕。返回 0
值表明程序程序成功执行完毕。
main 函数在很多方面都比较特别,其中最重要的是每个 C++ 程序必须含有
main 函数,且 main 函数是(唯一)被操作系统显式调用的函数。
定义 main 函数和定义其他函数一样。定义函数必须指定 4 个元素:返回
类型、函数名、圆括号内的形参表(可能为空)和函数体。main 函数的形参个
数是有限的。本例中定义的 main 函数形参表为空。第 7.2.6 节将介绍 main 函
数中可以定义的其他形参。
main 函数的返回值必须是 int 型,该类型表示整数。int 类型是内置类型,
即该类型是由 C++ 语言定义的。
函数体函数定义的最后部分,是以花括号开始并以花括号结束的语句块:
{
return 0;
}
例中唯一的语句就是 return,该语句终止函数。
注意return 语句后面的分号。在 C++ 中多数语句以分号作为
结束标记。分号很容易被忽略,而漏写分号将会导致莫名其妙
的编译错误信息。
当 return 带上一个值(如 0)时,这个值就是函数的返回值。返回值类型
必须和函数的返回类型相同,或者可以转换成函数的返回类型。对于 main 函数,
返回类型必须是 int 型,0 是 int 型的。
在大多数系统中,main 函数的返回值是一个状态指示器。返回值 0 往往表
示 main 函数成功执行完毕。任何其他非零的返回值都有操作系统定义的含义。
通常非零返回值表明有错误出现。每一种操作系统都有自己的方式告诉用户
main 函数返回什么内容。
18页
1.1.1. 编译与执行程序
程序编写完后需要进行编译。如何进行编译,与具体操作系统和编译器有关。
你需要查看有关参考手册或者询问有经验的同事,以了解所用的编译器的工作细
节。
许多基于 PC 的编译器都在集成开发环境(IDE)中运行,IDE 将编译器与
相关的构建和分析工具绑定在一起。这些环境在开发复杂程序时非常有用,但掌
握起来需要花费一点时间。通常这些环境包含点击式界面,程序员在此界面下可
以编写程序,并使用各种菜单来编译与执行程序本书不介绍怎样使用这些环境。
大多数编译器,包括那些来自 IDE 的,都提供了命令行界面。除非你已经
很熟悉你的 IDE,否则从使用简单的命令行界面开始可能更容易些。这样可以避
免在学习语言之前得先去学习 IDE。
程序源文件命名规范
不管我们使用命令行界面还是 IDE,大多数编译器希望待编译的程序保存在
文件中。程序文件称作源文件。大多数系统中,源文件的名字由文件名(如 prog1)
和文件后缀两部分组成。依据惯例,文件后缀表明该文件是程序。文件后缀通常
也表明程序是用什么语言编写的,以及选择哪一种编译器运行。我们用来编译本
书实例的系统将带有后缀 .cc 的文件视为 C++ 程序,因此我们将该程序保存
为:
prog1.cc
C++ 程序文件的后缀与运行的具体编译器有关。其他的形式还包括。
prog1.cxx
prog1.cpp
prog1.cp
prog1.C
19页
调用 GNU 或微软编译器
调用 C++ 编译器的命令因编译器和操作系统的不同而不同,常用的编译
器是 GNU 编译器和微软 Visual Studio 编译器。调用 GNU 编译器的默
认命令是 g++:
$ g++ prog1.cc -o prog1
这里的 $ 是系统提示符。这个命令产生一个为 prog1 或 prog1.exe 的
可执行文件。在 UNIX 系统下,可执行文件没有后缀;而在 Windows 下,
后缀为 .exe。-o prog1 是编译器参数以及用来存放可执行文件的文件
名。如果省略 -o prog1,那么编译器在 UNIX 系统下产生名为 a.out 而
在 Windows 下产生名为 a.exe 的可执行文件。
微软编译器采用命令 cl 来调用:
C:\directory> cl -GX prog1.cpp
这里的 C:directory> 是系统提示符,directory 是当前目录名。cl 是
调用编译器的命令。-GX 是一个选项,该选项在使用命令行界面编译器
程序时是必需的。微软编译器自动产生与源文件同名的可执行文件,这
个可执行文件具有 .exe 后缀且与源文件同名。本例中,可执行文件命
名为 prog1.exe。
更多的信息请参考你的编译器用户指南。
从命令行编译器
如果使用命令行界面,一般在控制台窗口(例如 UNIX 的 shell 窗口或
Windows 的命令提示窗口)编译程序。假设 main 程序在名为 prog1.cc 的文件
中,可以使用如下命令来编译:
$ CC prog1.cc
这里 CC 是编译器命令名,$ 表示系统提示符。编译器输出一个可执行文件,
我们可以按名调用这个可执行文件。在我们的系统中,编译器产生一个名为
a.exe 的可执行文件。UNIX 编译器则会将可执行文件放到一个名为 a.out 的文
件中。要运行可执行文件,可在命令提示符处给出该文件名:
$ a.exe
20页
执行编译过的程序。在 UNIX 系统中,即使在当前目录,有时还必须指定文
件所在的目录。这种情况下,键入:
$ ./a.exe
“.”后面的斜杠表明文件处于当前目录下。
访问 main 函数的返回值的方式和系统有关。不论 UNIX 还是 Windows 系
统,执行程序后,必须发出一个适当的 echo 命令。UNIX 系统中,通过键入如
下命令获取状态:
$ echo $?
要在 Windows 系统下查看状态,键入
C:\directory> echo %ERRORLEVEL%
Exercises Section 1.1.1
Exercise
1.1:
查看所用的编译器文档,了解它所用的文件命名规范。编
译并运行本节的 main 程序。
Exercise
1.2:
修改程序使其返回 -1。返回值 -1 通常作为程序运行失
败的指示器。然而,系统不同,如何(甚至是否)报告 main
函数运行失败也不同。重新编译并再次运行程序,看看你
的系统如何处理 main 函数的运行失败指示器。
1.2. 初窥输入/输出
C++ 并没有直接定义进行输入或输出(IO)的任何语句,这种功能是由标准
库提供的。IO 库提供了大量的设施。然而,对许多应用,包括本书的例子而言,
编程者只需要了解一些基本概念和操作。
本书的大多数例子都使用了处理格式化输入和输出的 iostream 库。
iostream 库的基础是两种命名为 istream 和 ostream 的类型,分别表示输入
流和输出流。流是指要从某种 IO 设备上读入或写出的字符序列。术语“流”试
图说明字符是随着时间顺序生成或消耗的。
21页
1.2.1. 标准输入与输出对象
标准库定义了 4 个 IO 对象。处理输入时使用命名为 cin(读作 see-in)
的 istream 类型对象。这个对象也称为标准输入。处理输出时使用命名为 cout
(读作 see-out)的 ostream 类型对象,这个对象也称为标准输出。标准库还
定义了另外两个 ostream 对象,分别命名为 cerr 和 clog(分别读作
“see-err”和“see-log”)。cerr 对象又叫作标准错误,通常用来输出警告
和错误信息给程序的使用者。而 clog 对象用于产生程序执行的一般信息。
一般情况下,系统将这些对象与执行程序的窗口联系起来。这样,当我们从
cin 读入时,数据从执行程序的窗口读入,当写到 cin、cerr 或 clog 时,输
出写至同一窗口。运行程序时,大部分操作系统都提供了重定向输入或输出流的
方法。利用重定向可以将这些流与所选择的文件联系起来。
1.2.2. 一个使用IO 库的程序
到目前为止,我们已经明白如何编译与执行简单的程序,虽然那个程序什么
也不做。在开篇的书店问题中,有一些记录含有相同的 ISBN,需要将这些记录
进行汇总,也就是说需要弄清楚如何累加已售出书籍的数量。
为了弄清楚如何解决这个问题,我们先来看应如何把两数相加。我们可以使用 IO 库来扩充 main 程序,要求用户给出两个数,然后输出它们的和:
#include *本站禁止HTML标签噢*
int main()
{
std::cout << "Enter two numbers:" << std::endl;
int v1, v2;
std::cin >> v1 >> v2;
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;
return 0;
}
程序首先在用户屏幕上显示提示语:
Enter two numbers:
然后程序等待用户输入。如果用户输入
3 7
跟着一个换行符,则程序产生下面的输出
22页
The sum of 3 and 7 is 10
程序的第一行是一个预处理指示:
#include *本站禁止HTML标签噢*
告诉编译器要使用 iostream 库。尖括号里的名字是一个。头文件。程序使
用库工具时必须包含相关的头文件。#include 指示必须单独写成一行——头文
件名和 #include 必须在同一行。通常,#include 指示应出现在任何函数的外
部。而且习惯上,程序的所有 #include 指示都在文件开头部分出现。
写入到流
main 函数体中第一条语句执行了一个表达式。C++ 中,一个表达式由一个
或几个操作数和通常是一个操作符组成。该语句的表达式使用输出操作符(<< 操
作符),在标准输出上输出提示语:
std::cout << "Enter two numbers:" << std::endl;
这个语句用了两次输出操作符。每个输出操作符实例都接受两个操作数:左
操作数必须是 ostream 对象;右操作数是要输出的值。操作符将其右操作数写
到作为其左操作数的 ostream 对象。
C++ 中,每个表达式都会产生一个结果,通常是将操作符作用到其操作数所
产生的值。当操作符是输出操作符时,结果是左操作数的值。也就是说,输出操
作返回的值是输出流本身。
既然输出操作符返回的是其左操作数,那么我们就可以将输出请求链接在一
起。输出提示语的那条语句等价于
(std::cout << "Enter two numbers:") << std::endl;
因为((std::cout << "Enter two numbers:"))返回其左操作数 std::cout,
这条语句等价于
std::cout << "Enter two numbers:";
std::cout << std::endl;
endl 是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行的效
果,并刷新与设备相关联的缓冲区。通过刷新缓冲区,用户可立即看到写入到
流中的输出。
23页
(复制比看累。很多地方都看不懂各种求)
