当前: 首页 - 图书专区 - C++程序设计:原理与实践(进阶篇)(原书第2版)
C++程序设计:原理与实践(进阶篇)(原书第2版)


  在线购买
[美] 本贾尼?斯特劳斯特鲁普 (Bjarne Stroustrup)著
978-7-111-56252-8
99.00
450
2017年04月07日
刘晓光 李忠伟 王刚 译
计算机 > 软件与程序设计 > C++
Pearson Education Asia
180
简体中文
16
Programming:Principles and Practice Using C++,Second Edition
教材
计算机科学丛书







本书是C++语言的发明人编写的一本C++教材。相比传统的入门教材,本书对基本概念和技术的解释更加深入,这种方法有助于学生编写有用的、正确的、高效的代码。本书的内容紧密结合C++语言的最新版本,对C++编程语言有详细的介绍,而且对面向对象程序设计和一般程序设计的知识也做了详细介绍。本书面向毫无基础的初学者,有助于他们自学,本书前半部分介绍了语言的概念、设计和编程技术、语言特性和库,后半部分介绍了更加专业的话题,提供更加丰富的参考资料。
《C++程序设计:原理与实践(原书第2版)》将经典程序设计思想与C++开发实践完美结合,全面地介绍了程序设计基本原理,包括基本概念、设计和编程技术、语言特性以及标准库等,教你学会如何编写具有输入、输出、计算以及简单图形显示等功能的程序。此外,本书通过对C++思想和历史的讨论、对经典实例(如矩阵运算、文本处理、测试以及嵌入式系统程序设计)的展示,以及对C语言的简单描述,为你呈现了一幅程序设计的全景图。
为方便读者循序渐进地学习,加上篇幅所限,《C++程序设计:原理与实践(原书第2版)》分为基础篇和进阶篇两册出版,基础篇包括第1~11章、第17~19章和附录A、C,进阶篇包括第12~16章、第20~27章和附录B、D、E。本书是进阶篇。

本书特点
C++初学者的权威指南。无论你是从事软件开发还是其他领域的工作,本书都将为你打开C++程序设计之门。
中高级程序员的必备参考。通过观察程序设计大师如何处理编程中的各种问题,你将获得新的领悟和指引。
全面阐释C++基本概念和技术。与传统的C++教材相比,本书对基本概念和技术的介绍更为深入,为你编写实用、正确、易维护和有效的代码打下坚实的基础。
强调现代C++(C++11和C++14)编程风格。本书从开篇就介绍现代C++程序设计技术,并揭示了大量关于如何使用C++标准库以及C++11和C++14的特性来简化程序设计的原理,使你快速掌握实用编程技巧。
配套教辅资源丰富。本书网站(www.stroustrup.com/Programming)提供了丰富的辅助资料,包括实例源码、PPT、勘误等。

作者简介
本贾尼·斯特劳斯特鲁普 (Bjarne Stroustrup) 英国剑桥大学计算机科学博士,C++的设计者和最初的实现者。他现在是德州农工大学计算机科学首席教授。1993年,由于在C++领域的重大贡献,他获得了ACM的 Grace Murray Hopper大奖并成为ACM院士。在进入学术界之前,他在AT&T贝尔实验室工作,是ISO C++标准委员会的创始人之一。
该死的鱼雷!全速前进。
——Admiral Farragut
程序设计是这样一门艺术,它将问题求解方案描述成计算机可以执行的形式。程序设计中很多工作都花费在寻找求解方案以及对其求精上。通常,只有在真正编写程序求解一个问题的过程中才会对问题本身理解透彻。
本书适合于那些从未有过编程经验但愿意努力学习程序设计技术的初学者,它能帮助读者理解使用C++语言进行程序设计的基本原理并获得实践技巧。本书的目标是使你获得足够多的知识和经验,以便能使用最新、最好的技术进行简单有用的编程工作。达到这一目标需要多长时间呢?作为大学一年级课程的一部分,你可以在一个学期内完成这本书的学习(假定你有另外四门中等难度的课程)。如果你是自学的话,不要期望能花费更少的时间完成学习(一般来说,每周15个小时,14周是合适的学时安排)。
三个月可能看起来是一段很长的时间,但要学习的内容很多。写第一个简单程序之前,就要花费大约一个小时。而且,所有学习过程都是渐进的:每一章都会介绍一些新的有用的概念,并通过真实应用中的例子来阐述这些概念。随着学习进程的推进,你通过程序代码表达思想的能力——让计算机按你的期望工作的能力,会逐渐稳步地提高。我绝不会说:“先学习一个月的理论知识,然后看看你是否能使用这些理论吧。”
为什么要学习程序设计呢?因为我们的文明是建立在软件之上的。如果不理解软件,那么你将退化到只能相信“魔术”的境地,并且将被排除在很多最为有趣、最具经济效益和社会效益的领域之外。当我谈论程序设计时,我所想到的是整个计算机程序家族,从带有GUI(图形用户界面)的个人计算机程序,到工程计算和嵌入式系统控制程序(如数码相机、汽车和手机中的程序),以及文字处理程序等,在很多日常应用和商业应用中都能看到这些程序。程序设计与数学有些相似,认真去做的话,会是一种非常有用的智力训练,可以提高我们的思考能力。然而,由于计算机能做出反馈,程序设计不像大多数数学形式那么抽象,因而对多数人来说更易接受。可以说,程序设计是一条能够打开你的眼界,将世界变得更美好的途径。最后,程序设计可以是非常有趣的。
为什么学习C++这门程序设计语言呢?学习程序设计是不可能不借助一门程序设计语言的,而C++直接支持现实世界中的软件所使用的那些关键概念和技术。C++是使用最为广泛的程序设计语言之一,其应用领域几乎没有局限。从大洋深处到火星表面,到处都能发现C++程序的身影。C++是由一个开放的国际标准组织全面考量、精心设计的。在任何一种计算机平台上都能找到高质量的、免费的C++实现。而且,用C++所学到的程序设计思想,大多数可直接用于其他程序设计语言,如C、C#、Fortran以及Java。最后一个原因,我喜欢C++适合编写优美、高效的代码这一特点。
本书不是初学程序设计的最简单入门教材,我写此书的用意也不在此。我为本书设定的目标是——这是一本能让你学到基本的实用编程技术的最简单书籍。这是一个非常雄心勃勃的目标,因为很多现代软件所依赖的技术,不过才出现短短几年时间而已。
我的基本假设是:你希望编写供他人使用的程序,并愿意认真负责地以较高质量完成这个工作,也就是说,假定你希望达到专业水准。因此,我为本书选择的主题覆盖了开始学习实用编程技术所需要的内容,而不只是那些容易讲授和容易学习的内容。如果某种技术是你做好基本编程工作所需要的,那么本书就会介绍它,同时展示用以支持这种技术的编程思想和语言工具,并提供相应的练习,期望你通过做这些练习来熟悉这种技术。但如果你只想了解“玩具程序”,那么你能学到的将远比我所提供的少得多。另一方面,我不会用一些实用性很低的内容来浪费你的时间,本书介绍的内容都是你在实践中几乎肯定会用到的。
如果你只是希望直接使用别人编写的程序,而不想了解其内部原理,也不想亲自向代码中加入重要的内容,那么本书不适合你,采用另一本书或另一种程序设计语言会更好些。如果这大概就是你对程序设计的看法,那么请同时考虑一下你从何得来的这种观点,它真的满足你的需求吗?人们常常低估程序设计的复杂程度和它的重要性。我不愿看到,你不喜欢程序设计是因为你的需求与我所描述的软件世界之间不匹配而造成的。信息技术世界中有很多地方是不要求程序设计知识的。本书面向的是那些确实希望编写和理解复杂计算机程序的人。
考虑到本书的结构和注重实践的特点,它也可以作为学习程序设计的第二本书,适合那些已经了解一点C++的人,以及那些会用其他语言编程而现在想学习C++的人。如果你属于其中一类,我不好估计你学习这本书要花费多长时间。但我可以给你的建议是,多做练习。因为你在学习中常见的一个问题是习惯用熟悉的、旧的方式编写程序,而不是在适当的地方采用新技术,多做练习会帮助你克服这个问题。如果你曾经按某种更为传统的方式学习过C++,那么在进行到第7章之前,你会发现一些令你惊奇的、有用的内容。除非你的名字是Stroustrup,否则你会发现我在本书中所讨论的内容不是“你父辈的C++”。
学习程序设计要靠编程实践。在这一点上,程序设计与其他需要实践学习的技艺是相似的。你不可能仅仅通过读书就学会游泳、演奏乐器或者开车,必须进行实践。同样,你也不可能不读写大量代码就学会程序设计。本书给出了大量代码实例,都配有说明文字和图表。你需要通过读这些代码来理解程序设计的思想、概念和原理,并掌握用来表达这些思想、概念和原理的程序设计语言的特性。但有一点很重要,仅仅读代码是学不会编程实践技巧的。为此,你必须进行编程练习,通过编程工具熟悉编写、编译和运行程序。你需要亲身体验编程中会出现的错误,学习如何修改它们。总之,在学习程序设计的过程中,编写代码的练习是不可替代的。而且,这也是乐趣所在!
另一方面,程序设计远非遵循一些语法规则和阅读手册那么简单。本书的重点不在于C++的语法,而在于理解基础思想、原理和技术,这是一名好程序员所必备的。只有设计良好的代码才有机会成为一个正确、可靠和易维护的系统的一部分。而且,“基础”意味着延续性:当现在的程序设计语言和工具演变甚至被取代后,这些基础知识仍会保持其重要性。
那么计算机科学、软件工程、信息技术等又如何呢?它们都属于程序设计范畴吗?当然不是!但程序设计是一门基础性的学科,是所有计算机相关领域的基础,在计算机科学领域占有重要的地位。本书对算法、数据结构、用户接口、数据处理和软件工程等领域的重要概念和技术进行了简要介绍,但本书不能替代对这些领域的全面、均衡的学习。
代码可以很有用,同样可以很优美。本书会帮你了解这一点,同时理解优美的代码意味着什么,并帮你掌握构造优美代码的原理和实践技巧。祝你学习程序设计顺利!
致学生
到目前为止,我在德州农工大学已经用本书教过几千名大一新生,其中60%曾经有过编程经历,而剩余40%从未见过哪怕一行代码。大多数学生的学习是成功的,所以你也可以成功。
你不一定是在某门课程中学习本书,本书也广泛用于自学。然而,不管你学习本书是作为课程的一部分还是自学,都要尽量与他人协作。程序设计有一个不好的名声——它是一种个人活动,这是不公正的。大多数人在作为一个有共同目标的团体的一份子时,工作效果更好,学习得更快。与朋友一起学习和讨论问题不是“作弊”,而是取得进步最有效同时也是最快乐的途径。如果没有特殊情况的话,与朋友一起工作会促使你表达出自己的思想,这正是测试你对问题理解和确认你的记忆的最有效方法。你没有必要独自解决所有编程语言和编程环境上的难题。但是,请不要自欺欺人——不去完成那些简单练习和大量的习题(即使没有老师督促你,你也不应这样做)。记住:程序设计(尤其)是一种实践技能,需要通过实践来掌握。如果你不编写代码(完成每章的若干习题),那么阅读本书就纯粹是一种无意义的理论学习。
大多数学生,特别是那些爱思考的好学生,有时会对自己努力工作是否值得产生疑问。当你产生这样的疑问时,休息一会儿,重新读一下前言,读一下第1章和第22章。在那里,我试图阐述我在程序设计中发现了哪些令人兴奋的东西,以及为什么我认为程序设计是能为世界带来积极贡献的重要工具。如果你对我的教学哲学和一般方法有疑问,请阅读引言。
你可能会对本书的厚度感到担心。本书如此之厚的一部分原因是,我宁愿反复重复一些解释说明或增加一些实例,而不是让你自己到处找这些内容,这应该令你安心。另外一个主要原因是,本书的后半部分是一些参考资料和补充资料,供你想要深入了解程序设计的某个特定领域(如嵌入式系统程序设计、文本分析或数值计算)时查阅。
还有,学习中请耐心些。学习任何一种重要的、有价值的新技能都要花费一些时间,而这是值得的。
致教师
本书不是传统的计算机科学导论书籍,而是一本关于如何构造能实际工作的软件的书。因此本书省略了很多计算机科学系学生按惯例要学习的内容(图灵完全、状态机、离散数学、乔姆斯基文法等)。硬件相关的内容也省略了,因为我假定学生从幼儿园开始就已经通过不同途径使用过计算机了。本书也不准备涉及一些计算机科学领域最重要的主题。本书是关于程序设计的(或者更一般地说,是关于如何开发软件的),因此关注的是少量主题的更深入的细节,而不是像传统计算机课程那样讨论很多主题。本书只试图做好一件事,而且计算机科学也不是一门课程可以囊括的。如果本书被计算机科学、计算机工程、电子工程(我们最早的很多学生都是电子工程专业的)、信息科学或者其他相关专业所采用,我希望这门课程能和其他一些课程一起进行,共同形成对计算机科学的完整介绍。
请阅读引言,那里有对我的教学哲学、一般方法等的介绍。请在教学过程中尝试将这些观点传达给你的学生。
ISO标准C++
C++由一个ISO标准定义。第一个ISO C++标准于1998年获得批准,所以那个版本的C++被称为C++98。写本书第1版时,我正从事C++11的设计工作。最令人沮丧的是,当时我还不能使用一些新语言特性(如统一初始化、范围for循环、move语义、lambda表达式、concept等)来简化原理和技术的展示。不过,由于设计该书时考虑到了C++11,所以很容易在合适的地方添加这些特性。在写作本版时,C++标准是2011年批准的C++11,2014 ISO标准C++14中的一些特性正在进入主流的C++实现中。本书中使用的语言标准是C++11,并涉及少量的C++14特性。例如,如果你的编译器不能编译下面的代码:

可用如下代码替代:

若你的编译器不支持C++11,请换一个新的编译器。好的、现代的C++编译器可从多处下载,见www.stroustrup.com/compilers.html。使用较早且缺少支持的语言版本会引入不必要的困难。
资源
本书支持网站的网址为www.stroustrup.com/Programming,其中包含了各种使用本书讲授和学习程序设计所需的辅助资料。这些资料可能会随着时间的推移不断改进,但对于初学者,现在可以找到这些资料:
基于本书的讲义幻灯片;
一本教师指南;
本书中使用的库的头文件和实现;
本书中实例的代码;
某些习题的解答;
可能会有用处的一些链接;
勘误表。
欢迎随时提出对这些资料的改进意见。
致谢
我要特别感谢已故的同事和联合导师Lawrence“Pete”Petersen,很久以前,在我还未感受到教授初学者的惬意时,是他鼓励我承担这项工作,并向我传授了很多能令课程成功的教学经验。没有他,这门课程的首次尝试就会失败。他参与了这门课程最初的建设,本书就是为这门课程所著。他还和我一起反复讲授这门课程,汲取经验,不断改进课程和本书。在本书中我使用的“我们”这个字眼,最初的意思就是指“我和Pete”。
我要感谢那些直接或间接帮助过我撰写本书的学生、助教和德州农工大学讲授ENGR 112、113及CSCE 121课程的教师,以及Walter Daugherity、Hyunyoung Lee、Teresa Leyk、Ronnie Ward、Jennifer Welch,他们也讲授过这门课程。还要感谢Damian Dechev、Tracy Hammond、Arne Tolstrup Madsen、Gabriel Dos Reis、Nicholas Stroustrup、J. C. van Winkel、Greg Versoonder、Ronnie Ward和Leor Zolman对本书初稿提出的建设性意见。感谢Mogens Hansen为我解释引擎控制软件。感谢Al Aho、Stephen Edwards、Brian Kernighan和Daisy Nguyen帮助我在夏天躲开那些分心的事,完成本书。
感谢Art Werschulz,他在纽约福特汉姆大学的课程中使用了本书第1版,并据此提出了很多建设性的意见。还要感谢Nick Maclaren,他在剑桥大学使用了本书的第1版,并对本书的习题提出了非常详尽的建议。他的学生在知识背景和专业需求上与德州农工大学大一学生有巨大的差异。
感谢Addison-Wesley公司为我安排的审阅者Richard Enbody、David Gustafson、Ron McCarty和K. Narayanaswamy,他们基于自身讲授C++课程或大学计算机科学导论课程的经验,对本书提出了宝贵的意见。还要感谢我的编辑Peter Gordon为本书提出的很多有价值的意见以及极大的耐心。我非常感谢Addison-Wesley公司的制作团队,他们为本书的高质量出版做出了很多贡献,他们是:Linda Begley(校对),Kim Arney(排版),Rob Mauhar(插图),Julie Nahil(制作编辑),Barbara Wood(文字编辑)。
感谢本书第1版的译者,他们发现并帮助澄清了很多问题。特别是,Lo?c Joly和Michel Michaud在法语翻译版中做了全面的技术检查,修改了很多问题。
我还要感谢Brian Kernighan和Doug McIlroy为撰写程序设计类书籍定下了一个非常高的标杆,以及Dennis Ritchie和Kristen Nygaard为实用编程语言设计提供的非常有价值的经验。
出版者的话
译者序
前言
引言
作者简介
第15章 容器和迭代器 1
15.1 存储和处理数据 1
15.1.1 处理数据 1
15.1.2 泛化代码 2
15.2 STL理念 4
15.3 序列和迭代器 7
15.3.1 回到实例 8
15.4 链表 9
15.4.1 链表操作 11
15.4.2 遍历 12
15.5 再次泛化vector 13
15.5.1 遍历容器 15
15.5.2 auto 15
15.6 实例:一个简单的文本编辑器 16
15.6.1 处理行 18
15.6.2 遍历 18
15.7 vector、list和string 21
15.7.1 insert和erase 22
15.8 调整vector类达到STL版本的功能 24
15.9 调整内置数组达到STL版本的功能 26
15.10 容器概览 27
15.10.1 迭代器类别 28
简单练习 29
思考题 30
术语 30
习题 31
附言 32
第16章 算法和映射 33
16.1 标准库算法 33
16.2 最简单的算法f?ind() 34
16.2.1 一些一般的应用 35
16.3 通用搜索算法f?ind_if() 36
16.4 函数对象 38
16.4.1 函数对象的抽象视图 39
16.4.2 类成员上的断言 39
16.4.3 lambda表达式 40
16.5 数值算法 41
16.5.1 累积 42
16.5.2 泛化accumulate() 43
16.5.3 内积 44
16.5.4 泛化inner_product() 45
16.6 关联容器 45
16.6.1 map 46
16.6.2 map概览 47
16.6.3 另一个map实例 50
16.6.4 unordered_map 51
16.6.5 set 53
16.7 拷贝 54
16.7.1 基本拷贝算法 55
16.7.2 流迭代器 55
16.7.3 使用set保持顺序 57
16.7.4 copy_if 57
16.8 排序和搜索 58
16.9 容器算法 60
简单练习 60
思考题 61
术语 62
习题 62
附言 63
第17章 一个显示模型 64
17.1 为什么要使用图形 64
17.2 一个基本显示模型 65
17.3 第一个例子 66
17.4 使用GUI库 68
17.5 坐标系 69
17.6 Shape 70
17.7 使用Shape类 70
17.7.1 图形头文件和主函数 70
17.7.2 一个几乎空白的窗口 71
17.7.3 坐标轴 73
17.7.4 绘制函数图 74
17.7.5 Polygon 75
17.7.6 Rectangle 76
17.7.7 填充 78
17.7.8 Text 78
17.7.9 Image 80
17.7.10 更多未讨论的内容 81
17.8 让图形程序运行起来 81
17.8.1 源文件 82
简单练习 83
思考题 83
术语 83
习题 84
附言 84
第18章 图形类 85
18.1 图形类概览 85
18.2 Point和Line 87
18.3 Lines 88
18.4 Color 91
18.5 Line_style 93
18.6 Open_polyline 95
18.7 Closed_polyline 96
18.8 Polygon 97
18.9 Rectangle 99
18.10 管理未命名对象 102
18.11 Text 104
18.12 Circle 105
18.13 Ellipse 107
18.14 Marked_polyline 108
18.15 Marks 110
18.16 Mark 111
18.17 Image 112
简单练习 114
思考题 115
术语 115
习题 116
附言 116
第19章 设计图形类 117
19.1 设计原则 117
19.1.1 类型 117
19.1.2 操作 118
19.1.3 命名 119
19.1.4 可变性 120
19.2 Shape 121
19.2.1 一个抽象类 122
19.2.2 访问控制 123
19.2.3 绘制形状 125
19.2.4 拷贝和可变性 127
19.3 基类和派生类 128
19.3.1 对象布局 130
19.3.2 类的派生和虚函数的定义 131
19.3.3 覆盖 131
19.3.4 访问 133
19.3.5 纯虚函数 134
19.4 面向对象程序设计的好处 135
简单练习 136
思考题 136
术语 137
习题 137
附言 138
第20章 绘制函数图和数据图 139
20.1 简介 139
20.2 绘制简单函数图 139
20.3 Function 143
20.3.1 默认参数 143
20.3.2 更多例子 144
20.3.3 lambda表达式 146
20.4 Axis 146
20.5 近似 148
20.6 绘制数据图 152
20.6.1 读取文件 153
20.6.2 一般布局 154
20.6.3 数据比例 155
20.6.4 构造数据图 156
简单练习 158
思考题 159
术语 159
习题 159
附言 160
第21章 图形用户界面 161
21.1 用户界面的选择 161
21.2 “Next”按钮 162
21.3 一个简单的窗口 163
21.3.1 回调函数 164
21.3.2 等待循环 166
21.3.3 lambda表达式作为回调函数 166
21.4 Button和其他Widget 167
21.4.1 Widget 167
21.4.2 Button 168
21.4.3 In_box和Out_box 169
21.4.4 Menu 170
21.5 一个实例 170
21.6 控制流反转 173
21.7 添加菜单 174
21.8 调试GUI代码 178
简单练习 179
思考题 179
术语 180
习题 180
附言 181
第22章 理念和历史 182
22.1 历史、理念和专业水平 182
22.1.1 程序设计语言的目标和哲学 182
22.1.2 编程理念 183
22.1.3 风格/范型 188
22.2 程序设计语言历史概览 190
22.2.1 最早的程序设计语言 191
22.2.2 现代程序设计语言的起源 193
22.2.3 Algol家族 197
22.2.4 Simula 203
22.2.5 C 204
22.2.6 C++ 207
22.2.7 今天 209
22.2.8 参考资料 210
思考题 211
术语 212
习题 212
附言 213
第23章 文本处理 214
23.1 文本 214
23.2 字符串 214
23.3 I/O流 217
23.4 映射 218
23.4.1 实现细节 222
23.5 一个问题 224
23.6 正则表达式的思想 225
23.6.1 原始字符串常量 227
23.7 用正则表达式进行搜索 228
23.8 正则表达式语法 229
23.8.1 字符和特殊字符 230
23.8.2 字符集 230
23.8.3 重复 231
23.8.4 子模式 232
23.8.5 可选项 232
23.8.6 字符集和范围 233
23.8.7 正则表达式错误 234
23.9 使用正则表达式进行模式匹配 235
23.10 参考文献 239
简单练习 239
思考题 239
术语 240
习题 240
附言 241
第24章 数值计算 242
24.1 简介 242
24.2 大小、精度和溢出 242
24.2.1 数值限制 245
24.3 数组 245
24.4 C风格的多维数组 246
24.5 Matrix库 247
24.5.1 矩阵的维和矩阵访问 248
24.5.2 一维矩阵 250
24.5.3 二维矩阵 252
24.5.4 矩阵I/O 253
24.5.5 三维矩阵 254
24.6 实例:求解线性方程组 255
24.6.1 经典的高斯消去法 256
24.6.2 选取主元 257
24.6.3 测试 257
24.7 随机数 258
24.8 标准数学函数 261
24.9 复数 262
24.10 参考文献 263
简单练习 264
思考题 264
术语 265
习题 265
附言 266
第25章 嵌入式系统程序设计 267
25.1 嵌入式系统 267
25.2 基本概念 269
25.2.1 可预测性 271
25.2.2 理想 272
25.2.3 生活在故障中 272
25.3 内存管理 274
25.3.1 动态内存分配存在的问题 274
25.3.2 动态内存分配的替代方法 276
25.3.3 存储池实例 277
25.3.4 栈实例 278
25.4 地址、指针和数组 279
25.4.1 未经检查的类型转换 279
25.4.2 一个问题:不正常的接口 280
25.4.3 解决方案:接口类 282
25.4.4 继承和容器 285
25.5 位、字节和字 287
25.5.1 位和位运算 287
25.5.2 bitset 290
25.5.3 有符号数和无符号数 292
25.5.4 位运算 295
25.5.5 位域 296
25.5.6 实例:简单加密 297
25.6 编码规范 301
25.6.1 编码规范应该是怎样的 302
25.6.2 编码原则实例 303
25.6.3 实际编码规范 307
简单练习 308
思考题 308
术语 310
习题 310
附言 311
第26章 测试 312
26.1 我们想要什么 312
26.1.1 警告 313
26.2 程序正确性证明 313
26.3 测试 313
26.3.1 回归测试 314
26.3.2 单元测试 315
26.3.3 算法和非算法 320
26.3.4 系统测试 325
26.3.5 寻找不成立的假设 326
26.4 测试方案设计 327
26.5 调试 328
26.6 性能 328
26.6.1 计时 329
26.7 参考文献 331
简单练习 331
思考题 331
术语 332
习题 332
附言 333
第27章 C语言 334
27.1 C和C++:兄弟 334
27.1.1 C/C++兼容性 335
27.1.2 C不支持的C++特性 336
27.1.3 C标准库 338
27.2 函数 338
27.2.1 不支持函数名重载 338
27.2.2 函数参数类型检查 339
27.2.3 函数定义 340
27.2.4 C++调用C和C调用C++ 341
27.2.5 函数指针 343
27.3 小的语言差异 344
27.3.1 struct标签名字空间 344
27.3.2 关键字 345
27.3.3 定义 345
27.3.4 C风格类型转换 347
27.3.5 无类型指针的转换 347
27.3.6 枚举 348
27.3.7 名字空间 348
27.4 自由存储空间 349
27.5 C风格字符串 350
27.5.1 C风格字符串和const 352
27.5.2 字节操作 352
27.5.3 实例:strcpy() 353
27.5.4 一个风格问题 353
27.6 输入/输出:stdio 354
27.6.1 输出 354
27.6.2 输入 355
27.6.3 文件 356
27.7 常量和宏 356
27.8 宏 357
27.8.1 类函数宏 358
27.8.2 语法宏 359
27.8.3 条件编译 360
27.9 实例:侵入式容器 360
简单练习 365
思考题 365
术语 366
习题 366
附言 367
附录C 标准库概要 368
附录D 安装FLTK 410
附录E GUI实现 413
术语表 419
参考文献 423
程序设计是打开计算机世界大门的金钥匙,它使五花八门的软件对你来说不再是“魔法”。C++语言则是掌握这把金钥匙的有力武器,它优美、高效,从大洋深处到火星表面,从系统核心到高层应用,从掌中的手机到超级计算机,到处都有C++程序的身影。本书的目标不是作为程序设计语言的简单入门教材,而是成为初学者学习基础实用编程技术的绝佳启蒙。如果你愿意努力学习,本书能帮助你理解使用C++语言进行程序设计的基本原理及大量实践技巧,其中大多数可直接用于其他程序设计语言。基于这一目标,注重实践是本书的明显特点。它希望教会你编写真正能被他人所使用的“有用的程序”,而非“玩具程序”。因此,本书不是机械地介绍各种C++特性,而是针对一些具体问题,不断精化其求解方案,在这个过程中自然地引出基本编程技术及相应的C++程序特性。此外,本书还介绍了大量的求解实际问题的程序设计技术,如语法分析器的设计、图形化程序设计、利用正则表达式处理文本、数值计算程序设计以及嵌入式程序设计等。在其他大多数程序设计入门书籍中,是找不到这些内容的。像调试技术、测试技术等其他程序设计书籍着墨不多的话题,本书也有详细的介绍。程序设计远非遵循语法规则和阅读手册那么简单,而在于理解基本思想、原理和技术,并进行大量实践。本书阐述了这一理念,为如何才能达到编写有用的、优美的程序这一最终目标指引了明确的方向。
本书的作者Bjarne Stroustrup是C++语言的设计者和最初的实现者,也是《The C++ Programming Language》(Addison-Wesley出版社)一书的作者。他现在是摩根斯坦利技术部门的总经理和哥伦比亚大学的客座教授,美国国家工程院的院士,ACM会士和IEEE会士。在进入学术界之前,他为AT&T贝尔实验室工作多年。他是ISO标准组织C++委员会的创建者,现在是该委员会语言演化工作组的主席。本书第1版已成为程序设计领域的经典著作,第2版又进行了精心的修订,增加了一些新的内容,包括C++14的一些新特性。
虽然是面向初学者,但本书原版仍是大部头。为方便读者循序渐进地学习,我们重新组织了章节顺序,将原版书组织为基础篇和进阶篇两册。基础篇包括第1~11章、第17~19章和附录A、C,进阶篇包括第12~16章、第20~27章和附录B、D、E。
基础篇 原 书 进阶篇 原 书
第1章 第1章 第15章 第20章
第2章 第2章 第16章 第21章
第3章 第3章 第17章 第12章
第4章 第4章 第18章 第13章
第5章 第5章 第19章 第14章
第6章 第6章 第20章 第15章
第7章 第7章 第21章 第16章
第8章 第8章 第22章 第22章
第9章 第9章 第23章 第23章
第10章 第10章 第24章 第24章
第11章 第11章 第25章 第25章
第12章 第17章 第26章 第26章
第13章 第18章 第27章 第27章
第14章 第19章 附录C 附录B
附录A 附录A 附录D 附录D
附录B 附录C 附录E 附录E

基础篇逻辑上分成四部分:第一部分介绍基本的C++程序设计知识,包括第一个“Hello, World!”程序、对象、类型、值、计算、错误处理、函数、类等内容,以及一个计算器程序实例;第二部分介绍字符方式输入输出,包括输入输出流的基本概念和格式化输出方法;第三部分介绍数据结构的基本知识,重点介绍向量以及自由内存空间、数组、模板和异常;第四部分为附录,介绍了C++语言概要和Visual Studio简要入门。通过基础篇的学习,读者可掌握C++最基本的语言特性,以及运用这些特性编写高质量程序的基本技巧。
在此基础上,进阶篇希望帮助读者学习一些更高级的编程技术及相应的C++语言特性,也逻辑上分成四部分:第一部分为数据结构和算法进阶知识,介绍容器和迭代器以及算法和映射;第二部分深入讨论输入输出,介绍图形/GUI类和图形化程序设计;第三部分希望拓宽读者的视野,介绍程序设计语言的理念和历史、文本处理技术、数值计算、嵌入式程序设计技术及测试技术,此外还较为详细地介绍了C语言与C++的异同;第四部分为附录,包括标准库概要、FLTK安装以及GUI实现等内容。
本书的引言、第1章以及第2~9章由任明明翻译,第10、11章和第17~21章由李忠伟翻译,第22~27章由刘晓光翻译,第12~16章以及前言、附录等由王刚翻译。翻译大师经典,难度超乎想象。接受任务之初,诚惶诚恐;翻译过程中,如履薄冰;完成后,忐忑不安。虽然竭尽全力,但肯定还有很多错漏之处,敬请读者批评指正。
感谢机械工业出版社华章公司的温莉芳总编辑将此重任交付译者,感谢朱劼等老师为本书所付出的心血,没有她们辛苦的编辑和审校,本书不可能完成。

译者
2016年11月于南开大学
计算机\程序设计
读者书评
发表评论



高级搜索
C++程序设计:原理与实践(基础篇)(原书第2版)
面向对象程序设计:C++实现
C++程序设计教程 第3版


版权所有© 2017  北京华章图文信息有限公司 京ICP备08102525号 京公网安备110102004606号
通信地址:北京市百万庄南街1号 邮编:100037
电话:(010)68318309, 88378998 传真:(010)68311602, 68995260
高校教师服务
华章教育微信
诚聘英才
诚聘英才