ANSI C++程序设计语言现在已经广泛应用于学术界和工业界,而且成为程序设计语言课程及计算机科学教学的首选语言之一。本书通过对C++程序设计语言关键特性的阐述和对具体C++程序示例的剖析,详细介绍了程序设计的过程。书中贯穿着对软件工程实践的描述,覆盖程序正确性和类型安全性,深入解释函数和指针,强调面向对象程序设计的概念,详细介绍泛型程序设计和STL,为了理解面向对象程序设计引入了UML。
本书适合作为计算机科学专业的第一门程序设计课程的教材。第一阶段指导学生如何编程,介绍C++程序设计语言,包括如何使用数组、指针及基于对象的程序设计基础;第二阶段介绍更高级的数据类型、面向对象程序设计、泛型程序设计与STL、文件处理和软件工程。此外,本书也适合没有编程经验的读者作为自学C+ +的参考书。
第1章 编写一个ANSI C++程序 1
1.1 编程准备 1
1.2 第一个程序 2
1.3 问题求解:烹饪法 4
1.4 用C++实现算法 7
1.5 软件工程:风格 8
1.6 常见的编程错误 9
1.7 编写并运行一个C++程序 9
1.7.1 中断程序 11
1.7.2 键入一个文件结束符 11
1.8 Pohl博士的建议 11
1.9 C++与Java的比较 12
小结 13
复习题 14
习题 14
第2章 基本类型和语句 17
2.1 程序元素 17
2.1.1 注释 18
2.1.2 关键字 18
2.1.3 标识符 19
2.1.4 文字 20
2.1.5 运算符和标点符号 21
2.2 输入和输出 21
2.3 程序结构 23
2.4 简单类型 26
2.5 传统的类型转换 28
2.6 枚举类型 30
2.7 表达式 31
2.7.1 运算符的优先级和结合性 32
2.7.2 关系运算符、判等运算符和逻辑运算符 33
2.8 语句 36
2.8.1 赋值和表达式 36
2.8.2 复合语句 37
2.8.3 if和if-else语句 37
2.8.4 while语句 39
2.8.5 for语句 40
2.8.6 do语句 41
2.8.7 break语句和continue语句 42
2.8.8 switch语句 42
2.8.9 goto语句 44
2.9 软件工程:调试 44
2.10 Pohl博士的建议 47
2.11 C++与Java的比较 48
小结 49
复习题 50
习题 51
第3章 函数、指针和数组 54
3.1 函数 54
3.2 函数调用 54
3.3 函数定义 56
3.4 return语句 57
3.5 函数原型 57
3.6 传值调用 58
3.7 递归 59
3.8 默认参数 60
3.9 函数作为参数 62
3.10 重载函数 63
3.11 内联 64
3.12 作用域和存储类型 65
3.12.1 自动存储类型auto 66
3.12.2 外部存储类型extern 66
3.12.3 寄存器存储类型register 67
3.12.4 静态存储类型static 67
3.12.5 头文件和链接的秘密 68
3.13 名字空间 70
3.14 指针类型 71
3.14.1 取地址和解除引用 72
3.14.2 基于指针的引用调用 72
3.15 引用声明 73
3.16 void的用法 75
3.17 数组 75
3.17.1 下标 76
3.17.2 初始化 76
3.18 数组和指针 76
3.19 将数组传递给函数 77
3.20 问题求解:随机数 78
3.21 软件工程:结构化程序设计 80
3.22 核心语言ADT:char*字符串 82
3.23 多维数组 85
3.24 new和delete运算符 87
3.24.1 用向量代替数组 88
3.24.2 用string代替char* 89
3.25 软件工程:程序正确性 90
3.26 Pohl博士的建议 91
3.27 C++与Java的比较 92
小结 93
复习题 94
习题 94
第4章 类和抽象数据类型 100
4.1 聚集类型class和struct 100
4.2 成员选择运算符 101
4.3 成员函数 102
4.4 访问权限:私有和公有 105
4.5 类 106
4.6 类作用域 108
4.6.1 作用域解析运算符 108
4.6.2 嵌套类 109
4.7 示例:五张同花牌 110
4.8 this指针 114
4.9 static成员 115
4.10 const成员 116
4.11 容器类示例:ch_stack 118
4.12 软件工程:类的设计 120
4.12.1 设计中的折中 121
4.12.2 统一建模语言和设计 122
4.13 Pohl博士的建议 122
4.14 C++与Java的比较 123
4.15 高级主题 124
4.15.1 指向类成员的指针 124
4.15.2 联合 125
4.15.3 位域 126
小结 127
复习题 128
习题 128
第5章 构造函数、析构函数、类型转换与运算符重载 132
5.1 带有构造函数的类 133
5.1.1 默认构造函数 134
5.1.2 构造函数初始化式 134
5.1.3 用作类型转换的构造函数 135
5.1.4 改进point类 136
5.1.5 构造栈 137
5.1.6 复制构造函数 139
5.2 带有析构函数的类 141
5.3 类类型成员 141
5.4 示例:单向链表 142
5.5 使用引用语义的字符串 145
5.6 构造函数的问题和秘密 147
5.6.1 析构函数详解 148
5.6.2 构造函数语法 149
5.7 使用函数重载实现多态 149
5.8 ADT转换 150
5.9 重载和签名匹配 150
5.10 友元函数 153
5.11 重载运算符 154
5.12 一元运算符重载 155
5.13 二元运算符重载 157
5.14 重载赋值运算符 158
5.15 重载下标运算符 160
5.16 重载用于索引的()运算符 160
5.17 重载<>运算符 160
5.18 重载->运算符 161
5.19 重载new和delete 163
5.20 更多签名匹配 164
5.21 软件工程:何时使用重载 165
5.22 Pohl博士的建议 166
5.23 C++与Java的比较 167
小结 171
复习题 172
习题 172
第6章 模板与泛型程序设计 177
6.1 模板类stack 179
6.2 函数模板 181
6.2.1 签名匹配与重载 182
6.2.2 如何编写简单函数square() 183
6.3 泛型代码开发:快速排序 184
6.4 类模板 189
6.4.1 友元 189
6.4.2 静态成员 189
6.4.3 类模板参数 190
6.4.4 默认模板参数 190
6.4.5 成员模板 191
6.5 参数化vector类 191
6.6 使用STL的string、vector和complex 193
6.6.1 string和basic_string<> 193
6.6.2 标准模板库中的vector<> 194
6.6.3 使用complex<> 195
6.6.4 limits和其他有用的模板 195
6.7 软件工程:复用和泛型 196
6.7.1 调试模板代码 196
6.7.2 特殊考虑 197
6.7.3 使用typename 198
6.8 Pohl博士的建议 198
6.9 C++与Java的比较 199
小结 201
复习题 201
习题 202
第7章 标准模板库 204
7.1 一个简单STL示例 204
7.2 容器 206
7.2.1 顺序容器 208
7.2.2 关联容器 209
7.2.3 容器适配器 213
7.3 迭代器 215
7.3.1 istream和ostream的迭代器 216
7.3.2 迭代器适配器 218
7.4 算法 219
7.4.1 排序算法 219
7.4.2 不可变序算法 221
7.4.3 变序性算法 223
7.4.4 数值算法 224
7.5 数值积分 226
7.6 STL:函数对象 228
7.6.1 建立函数对象 229
7.6.2 函数适配器 230
7.7 配置器 231
7.8 软件工程:使用STL 231
7.9 Pohl博士的建议 233
7.10 C++与Java的比较 234
小结 234
复习题 234
习题 235
第8章 继承与面向对象程序设计 237
8.1 派生类 238
8.2 学生是人 241
8.3 虚函数:动态限定 243
8.3.1 重载与重写 245
8.3.2 典型示例:shape类 246
8.4 抽象基类 247
8.5 模板与继承 253
8.6 多继承 254
8.7 RTTI以及其他需要注意的问题 255
8.8 软件工程:继承与设计 257
8.8.1 子类型 258
8.8.2 代码复用 258
8.9 Pohl博士的建议 259
8.10 C++与Java的比较 259
小结 261
复习题 262
习题 262
第9章 输入/输出 265
9.1 输出类ostream 265
9.2 格式化输出和iomanip 266
9.3 用户自定义类型的输出 269
9.4 输入类istream 271
9.5 文件 272
9.6 用字符串作为流 274
9.7 ctype中的函数和宏 275
9.8 使用流状态 276
9.9 混合I/O库 277
9.10 软件工程:I/O 278
9.11 Pohl博士的建议 279
9.12 C++与Java的比较 280
小结 281
复习题 282
习题 282
第10章 异常与程序正确性 285
10.1 使用assert库 285
10.2 C++的异常 287
10.3 抛出异常 287
10.3.1 重新抛出异常 289
10.3.2 异常表达式 290
10.4 try块 292
10.5 处理器 292
10.6 将断言转换为异常 293
10.7 异常说明 295
10.8 terminate()和unexpected() 296
10.9 标准异常及其应用 296
10.10 软件工程:异常对象 297
10.11 Pohl博士的建议 299
10.12 C++与Java的比较 299
小结 301
复习题 302
习题 302
第11章 使用C++进行面向对象程序设计 304
11.1 面向对象程序设计语言的特性 304
11.1.1 抽象数据类型:封装和数据隐藏 305
11.1.2 复用和继承 306
11.1.3 多态性 306
11.2 面向对象程序设计:主流程序设计方法 307
11.3 面向对象程序设计思想 312
11.4 类-职责-协作者 313
11.5 设计模式 315
11.6 深入了解C++ 315
11.6.1 C++为什么优于Java 316
11.6.2 C++的不足 316
11.7 软件工程:值得思考的问题 317
11.8 Pohl博士的建议 317
11.9 C++与Java的比较 318
小结 322
复习题 323
习题 323
附录A ASCII字符编码 325
附录B 运算符的优先级与结合性 326
附录C 字符串库 327
附录D tio库(图灵网站下载)
索引 332
C++是当今最为流行和实用的一门高级程序设计语言,它不仅保留了传统的结构化程序设计方法,而且对先进的面向对象程序设计方法也提供了完整的支持。随着ANSI和ISO C++标准相继制定完成,C++作为一种功能强大的面向对象程序设计语言,已经被全世界的程序员广泛使用。现在C++语言的身影几乎遍及所有计算机研究与应用领域。
本书通过程序示例和对C++程序设计语言关键特性的阐述,循序渐进地详细介绍了C++程序设计的过程。书中第1章~第5章介绍了C++程序设计语言的基础知识,包括C++语言的基本数据类型、语句、指针、数组以及基于对象的程序设计基础;第6章~第11章着重介绍了C++语言的面向对象特性,包括高级数据类型、面向对象程序设计、泛型程序设计和STL、文件处理以及软件工程。
本书最大的特色是采用解析方法阐述代码的关键特性,以易于理解的文字渐进式地向读者解释在代码中遇到的程序设计元素和方法,帮助读者更好地理解程序设计思想,逐步引导读者成为富有经验的程序员。另外,在本书的每一章还对C++语言和Java语言进行了比较,不仅可以帮助熟悉Java的程序员了解C++,那些已经熟悉C++,还想进一步学习Java的程序员也可以从中受益。
本书是多人共同努力的结果,参与本书翻译的人员有马锐、薛静锋、吕坤、陈朔鹰、刘瑾、江雪、彭一明、束罡和刘光宗等。全书由马锐统稿。
限于译者水平,译文难免有不当和疏漏之处,敬请读者不吝指正。
译 者
2007年5月
现在,ANSI C++程序设计语言已经广泛应用于全世界的学术界和工业界。在许多教育机构,它都是程序设计语言课程的首选语言,也是计算机科学教学的首选语言。究其原因,主要是因为C++是学习更高级课程所必需的基础课程;而且,C++拥有众多实用库,得到许多复杂集成环境的支持,它是一种能够有效地支持当今主流的面向对象程序设计方法的语言。
本书通过精心开发的可实际工作的程序来介绍程序设计过程,并以此阐明C++程序设计语言的关键特性。书中以易于理解的方式解释了程序代码,这些程序代码都在多个平台上进行了测试。书中的代码能够在大多数C++系统上使用,包括MacOS、MS-DOS、OS/2、UNIX和Windows等操作系统上的C ++系统。
C++是由贝尔实验室的Bjarne Stroustrup在20世纪80年代中期发明的一种功能强大的现代语言;C++语言是C语言的后续语言,它在C语言的基础上增加了类的概念,提供了一种用户自定义类型(也叫抽象数据类型)的机制。通过自定义用户类型、继承和运行时类型绑定,C++提供了对面向对象程序设计的支持。
解析方法
本书通过精心开发的可实际工作的C++程序,利用解析(dissection)的方法,向读者清晰而详细地介绍了C++程序设计的过程。解析是作者在 1984年首先开发的一种教学方法,用来阐述代码的关键特性。解析类似于对代码进行的初始结构化分析,其目的是向读者解释在代码中遇到的程序设计元素和方法。解析以易于理解的语言渐进式地解释程序和函数,可以加强读者对不同上下文中程序和函数的关键思想的理解。
无需任何程序设计背景
本书主要面向没有任何程序设计背景的读者,不熟悉C++的有编程经验的程序员也可以从中获益。本书可以作为学生学习计算机科学或程序设计的第一门课程的教材。
本书适用于计算机科学专业或其他学科的第一门程序设计课程。书中的每一章都给出了对大量程序的具体解释,以启发式方法引导学生提高程序设计技巧。本书首先介绍一个完整的程序,然后再介绍函数的编写,函数也是结构化程序设计的主要特点。函数和程序的关系类似于段落和文章的关系,编写完整的函数是程序员必须具备的能力,因此本书将其作为重点强调。书中有大量不同难度的示例和习题,教师可以从中选择合适的示例和习题进行讲解。
本书特色
本书有许多特色:
□在网站上有本书原版的全部电子文档,也有指向有用站点的链接和本书完整的程序代码。
□书中贯穿着对软件工程实践的描述。
□每章都为初学者提供了作者建议的简明的编程技巧。
□对简单的递归提前进行解释,这是计算机科学课程导论部分的内容。
□覆盖了程序正确性和类型安全性。
□深入解释了函数和指针,这些概念通常是初学者学习时遇到的最大障碍。
□强调了面向对象程序设计的概念。
□详细描述了泛型编程和STL。
□为了理解面向对象编程引入了UML图。
□与Java进行了比较,并配备了可选的Java习题,指出了Java by Dissection(与Charlie McDowell合著)一书中的对应内容。
章节特色
每章都包含了下列教学要素。
解析 通过解析的方法解释了重要示例程序的主要元素。这种对新的程序设计思想的渐进式讨论有助于第一次接触这些设计思想的读者更好地理解这些思想。
面向对象程序设计 逐步引导读者熟悉面向对象风格。第4章介绍了类:类是产生模块化程序和实现抽象数据类型的基本机制,类变量是被操纵的对象。第8章介绍了两个关键概念,即继承和虚函数。第11章讨论了面向对象程序设计原理。本书培养了程序员的面向对象程序设计观念。
编程风格和软件工程 本书通篇强调了编程风格和软件方法。本书一开始就介绍了一些重要的概念,例如结构化分支语句、嵌套控制流程、自顶向下设计方法和面向对象程序设计。本书一开始就采用了一致和合理的代码风格,并详细阐述了这种风格的重要性和原理。本书采用的代码风格也是C++专业编程人员最常用的风格。
可实际工作的代码 本书的程序代码都是可实际工作的,通过这些可执行的代码,学生能够更好地理解要讨论的程序设计思想。本书通过解析的方式解释了许多程序和函数,在习题中还经常涉及这些程序设计思想。
常见的编程错误 本书描述了许多典型的编程错误以及避免这些错误的方法。学习一门程序设计语言有障碍很大程度上是因为遇到了一些难以理解的错误,许多书籍只讨论了正确的程序代码,而让读者自己通过试错过程去发现程序设计中的漏洞。本书不但解释了C++中的典型错误是如何造成的,还解释了如何改正这些错误。
Pohl博士的建议 作者基于丰富的编程经验提出了一系列的编程技巧,对每一个技巧都简明指出了基本原理。
与Java的比较 在可选的章节中介绍了与C++实例进行对比的Java语言程序设计元素,习题中也给出了相关内容。在大多数情况下,C++与Java具有同样的程序设计元素,本书可以帮助熟悉Java的学生学习如何从Java迁移到C++。那些熟悉C++的学生,如果想进一步学习Java,也可以从这些章节中受益。此外,想学习本书姊妹书Java by Dissection的读者,也可以通过本书熟悉我们讲解Java的方法。
小结 每章过后都有关于本章要点的简明列表,这可以帮助读者回顾这一章的内容,加深对这一章中提出的新观点的理解。
习题 习题用于检验学生对语言知识的掌握程度。许多习题的设计目标都是为了便于读者进行交互式学习,这样有助于读者自学。除了针对语言特性的习题之外,一些习题也针对某个主题给出了更多的细节,还有一些习题则引入了更深层次的知识。
课堂教学
本书可以作为教材使用。第一阶段指导学生如何编程,主要包括第1章~第5章的内容。这部分通过如何使用数组、指针以及基本的面向对象程序设计来介绍C++ 程序设计语言。第二阶段包括第6章~第11章的内容,介绍更高级的数据类型、面向对象程序设计、泛型程序设计和STL、文件处理和软件工程。如果课程是为已经有程序设计基础(不一定是C++语言程序设计基础)的学生设计的,教师可以介绍本书的所有主题。本书也可以作为需要学生使用C++的其他计算机科学课程的教材。在语言比较课中,本书可以与其关于C、Java和C#的姊妹书一同使用,它们采用同样的解析方法,用各自的语言编写了相同的示例。
交互式环境
本书是为交互式环境编写的,我们鼓励读者通过键盘和屏幕进行实验。许多PC厂商都支持交互式的C++系统,如Borland、IBM、Metroworks、微软和Symantec等。
专业人员
虽是为初学者而写,但本书同样可以成为经验丰富的程序员的良师益友。结合Al Kelley和Ira Pohl合著的A Book on C,计算机专业人员能够综合理解这两种语言。这两本书相辅相承,对C/C++程序设计语言进行了综合介绍,非常难得。此外,结合Ira Pohl和Charlie McDowell合著的Java by Dissection,学生和专业人员能够获得对面向对象语言Java的完全理解。
本书是作者讲授的许多在线专业培训课程的基础。从1986年起,作者就使用这些内容在各种各样的论坛上培训专业人员和学生。本书也是www.digitalthink.com提供的基于Web的C++培训的基础。
教辅材料
对使用本书作为教材的教师,Addison-Wesley 可以提供以下教辅材料:
□习题解答。
□示例程序代码。
□含有所有插图的PowerPoint幻灯片。
要想了解更多关于教辅材料的信息,请访问www.aw.com/cssupport。
致谢
特别感谢Uwe F. Mayer、George Belotsky和Bruce Montague,他们仔细阅读了本书,提出了许多改进建议。感谢评审专家:科罗拉多州立大学的Charles Anderson,杨百翰大学的Parris Egbert,海军研究生院的Chris Eagle,路易斯安那州立大学的Nigel Gwee,佛罗里达州立大学的Stephen P. Leach和宾夕法尼亚州立大学的Steven C. Shaffer。感谢John dePillis、Debra Dolsberry和Laura Pohl,他们设计并绘制了许多卡通插图。特别要感谢Debra Dolsberry,她是本书许多材料的主要技术编辑,此外,她也负责使用FrameMaker对本书进行排版。感谢Charlie McDowell和Al Kelley编写了关于C和Java的姊妹篇。
感谢组稿编辑Maite Suarez-Rivas、项目编辑Katherine Harutunian和副总编Patty Mahtani,感谢她们的热心、支持和鼓励。感谢Argosy的Caroline Roop和Sally Boylan,感谢她们对于本书出版的悉心关注!
Ira Pohl
无封面