C++程序设计:原理与实践(基础篇)(原书第2版)
作者 : [美] 本贾尼?斯特劳斯特鲁普 (Bjarne Stroustrup)著
丛书名 : 计算机科学丛书
出版日期 : 2017-04-07
ISBN : 978-7-111-56225-2
定价 : 99.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 429
开本 : 16
原书名 : Programming:Principles and Practice Using C++,Second Edition
原出版社: Pearson Education Asia
属性分类: 教材
包含CD :
绝版 :
图书简介

本书是C++语言的发明人编写的一本C++教材。相比传统的入门教材,本书对基本概念和技术的解释更加深入,这种方法有助于学生编写有用的、正确的、高效的代码。本书的内容紧密结合C++语言的最新版本,对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为实用编程语言设计提供的非常有价值的经验。

上架指导

计算机\程序设计

封底文字

《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++11和C++14)编程风格。本书从开篇就介绍现代C++程序设计技术,并揭示了大量关于如何使用C++标准库以及C++11和C++14的特性来简化程序设计的原理,使你快速掌握实用编程技巧。
● 配套教辅资源丰富。本书网站(www.stroustrup.com/Programming)提供了丰富的辅助资料,包括实例源码、PPT、勘误等。

作者简介

[美] 本贾尼?斯特劳斯特鲁普 (Bjarne Stroustrup)著:
本贾尼·斯特劳斯特鲁普 (Bjarne Stroustrup) 英国剑桥大学计算机科学博士,C++的设计者和最初的实现者。他现在是德州农工大学计算机科学首席教授。1993年,由于在C++领域的重大贡献,他获得了ACM的 Grace Murray Hopper大奖并成为ACM院士。在进入学术界之前,他在AT&T贝尔实验室工作,是ISO C++标准委员会的创始人之一。
 

译者序

程序设计是打开计算机世界大门的金钥匙,它使五花八门的软件对你来说不再是“魔法”。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月于南开大学

图书目录

出版者的话
译者序
前言
引言
作者简介
第1章 计算机、人与程序设计 1
1.1 简介 1
1.2 软件 1
1.3 人 3
1.4 计算机科学 5
1.5 计算机已无处不在 6
1.5.1 有屏幕和无屏幕 6
1.5.2 船舶 6
1.5.3 电信 7
1.5.4 医疗 9
1.5.5 信息领域 10
1.5.6 一种垂直的视角 11
1.5.7 与C++程序设计有何联系 12
1.6 程序员的理想境界 12
思考题 14
术语 15
习题 15
附言 16
第2章 Hello, World! 17
2.1 程序 17
2.2 经典的第一个程序 17
2.3 编译 20
2.4 链接 22
2.5 编程环境 22
简单练习 23
思考题 24
术语 25
习题 25
附言 26
第3章 对象、类型和值 27
3.1 输入 27
3.2 变量 28
3.3 输入和类型 29
3.4 运算和运算符 31
3.5 赋值和初始化 33
3.5.1 实例:检测重复单词 34
3.6 复合赋值运算符 36
3.6.1 实例:重复单词计数 36
3.7 命名 37
3.8 类型和对象 39
3.9 类型安全 40
3.9.1 安全转换 40
3.9.2 不安全转换 41
简单练习 43
思考题 44
术语 45
习题 45
附言 46
第4章 计算 47
4.1 简介 47
4.2 目标和工具 48
4.3 表达式 50
4.3.1 常量表达式 51
4.3.2 运算符 52
4.3.3 类型转换 53
4.4 语句 54
4.4.1 选择语句 55
4.4.2 循环语句 59
4.5 函数 62
4.5.1 为什么使用函数 64
4.5.2 函数声明 65
4.6 vector 65
4.6.1 遍历一个vector 66
4.6.2 vector空间增长 67
4.6.3 一个数值计算实例 67
4.6.4 一个文本实例 69
4.7 语言特性 70
简单练习 71
思考题 71
术语 72
习题 72
附言 74
第5章 错误 75
5.1 简介 75
5.2 错误的来源 76
5.3 编译时错误 77
5.3.1 语法错误 77
5.3.2 类型错误 78
5.3.3 警告 78
5.4 链接时错误 79
5.5 运行时错误 79
5.5.1 调用者处理错误 80
5.5.2 被调用者处理错误 81
5.5.3 报告错误 82
5.6 异常 83
5.6.1 参数错误 84
5.6.2 范围错误 85
5.6.3 输入错误 86
5.6.4 窄化错误 88
5.7 逻辑错误 89
5.8 估计 91
5.9 调试 92
5.9.1 实用调试建议 93
5.10 前置条件和后置条件 95
5.10.1 后置条件 97
5.11 测试 98
简单练习 98
思考题 99
术语 100
习题 100
附言 102
第6章 编写一个程序 103
6.1 一个问题 103
6.2 对问题的思考 103
6.2.1 程序设计的几个阶段 104
6.2.2 策略 104
6.3 回到计算器问题 106
6.3.1 第一步尝试 106
6.3.2 单词 108
6.3.3 实现单词 109
6.3.4 使用单词 110
6.3.5 重新开始 111
6.4 文法 112
6.4.1 英文文法 116
6.4.2 设计一个文法 117
6.5 将文法转换为程序 117
6.5.1 实现文法规则 118
6.5.2 表达式 118
6.5.3 项 121
6.5.4 基本表达式 123
6.6 试验第一个版本 123
6.7 试验第二个版本 126
6.8 单词流 128
6.8.1 实现Token_stream 129
6.8.2 读单词 130
6.8.3 读数值 131
6.9 程序结构 131
简单练习 133
思考题 133
术语 134
习题 134
附言 135
第7章 完成一个程序 136
7.1 简介 136
7.2 输入和输出 136
7.3 错误处理 138
7.4 处理负数 141
7.5 模运算% 142
7.6 清理代码 143
7.6.1 符号常量 143
7.6.2 使用函数 145
7.6.3 代码布局 145
7.6.4 注释 146
7.7 错误恢复 148
7.8 变量 150
7.8.1 变量和定义 150
7.8.2 引入name单词 154
7.8.3 预定义名字 156
7.8.4 我们到达目的地了吗 156
简单练习 157
思考题 157
术语 158
习题 158
附言 159
第8章 函数相关的技术细节 160
8.1 技术细节 160
8.2 声明和定义 161
8.2.1 声明的类别 164
8.2.2 变量和常量声明 164
8.2.3 默认初始化 165
8.3 头文件 165
8.4 作用域 167
8.5 函数调用和返回 171
8.5.1 声明参数和返回类型 171
8.5.2 返回一个值 172
8.5.3 传值 173
8.5.4 传常量引用 174
8.5.5 传引用 176
8.5.6 传值与传引用的对比 178
8.5.7 参数检查和转换 179
8.5.8 实现函数调用 180
8.5.9 constexpr函数 183
8.6 计算顺序 184
8.6.1 表达式计算 185
8.6.2 全局初始化 186
8.7 名字空间 187
8.7.1 using声明和using指令 188
简单练习 189
思考题 190
术语 191
习题 191
附言 192
第9章 类相关的技术细节 193
9.1 用户自定义类型 193
9.2 类和成员 194
9.3 接口和实现 194
9.4 演化一个类 196
9.4.1 结构和函数 196
9.4.2 成员函数和构造函数 197
9.4.3 保持细节私有性 199
9.4.4 定义成员函数 200
9.4.5 引用当前对象 202
9.4.6 报告错误 202
9.5 枚举类型 203
9.5.1 “平坦”枚举 205
9.6 运算符重载 205
9.7 类接口 206
9.7.1 参数类型 207
9.7.2 拷贝 209
9.7.3 默认构造函数 209
9.7.4 const成员函数 212
9.7.5 类成员和“辅助函数” 213
9.8 Date类 214
简单练习 217
思考题 218
术语 218
习题 218
附言 220
第10章 输入输出流 221
10.1 输入和输出 221
10.2 I/O流模型 222
10.3 文件 223
10.4 打开文件 224
10.5 读写文件 226
10.6 I/O错误处理 227
10.7 读取单个值 229
10.7.1 将程序分解为易管理的子模块 231
10.7.2 将人机对话从函数中分离 233
10.8 用户自定义输出运算符 234
10.9 用户自定义输入运算符 235
10.10 一个标准的输入循环 235
10.11 读取结构化的文件 236
10.11.1 在内存中的表示 237
10.11.2 读取结构化的值 238
10.11.3 改变表示方法 241
练习 242
思考题 243
术语 243
习题 243
附言 244
第11章 定制输入输出 245
11.1 有规律的与无规律的输入和输出 245
11.2 格式化输出 245
11.2.1 输出整数 246
11.2.2 输入整数 247
11.2.3 输出浮点数 248
11.2.4 精度 249
11.2.5 域 250
11.3 打开和定位文件 250
11.3.1 文件打开模式 251
11.3.2 二进制文件 252
11.3.3 在文件中定位 254
11.4 字符串流 254
11.5 面向行的输入 255
11.6 字符分类 256
11.7 使用非标准分隔符 258
11.8 更多未讨论内容 263
简单练习 263
思考题 264
术语 264
习题 265
附言 266
第12章 向量和自由空间 267
12.1 简介 267
12.2 vector的基本知识 268
12.3 内存、地址和指针 269
12.3.1 sizeof运算符 271
12.4 自由空间和指针 272
12.4.1 自由空间分配 273
12.4.2 通过指针访问数据 274
12.4.3 指针范围 274
12.4.4 初始化 276
12.4.5 空指针 277
12.4.6 自由空间释放 277
12.5 析构函数 279
12.5.1 生成的析构函数 280
12.5.2 析构函数和自由空间 281
12.6 访问元素 282
12.7 指向类对象的指针 283
12.8 类型混用:void*和类型转换 284
12.9 指针和引用 285
12.9.1 指针参数和引用参数 286
12.9.2 指针、引用和继承 287
12.9.3 实例:链表 287
12.9.4 链表操作 289
12.9.5 链表的使用 290
12.10 this指针 291
12.10.1 关于链表使用的更多讨论 293
简单练习 294
思考题 294
术语 295
习题 295
附言 296
第13章 向量和数组 297
13.1 简介 297
13.2 初始化 298
13.3 拷贝 299
13.3.1 拷贝构造函数 300
13.3.2 拷贝赋值 301
13.3.3 拷贝术语 303
13.3.4 移动 304
13.4 必要的操作 305
13.4.1 显式构造函数 307
13.4.2 调试构造函数和析构函数 308
13.5 访问vector元素 309
13.5.1 对const向量重载运算符 311
13.6 数组 311
13.6.1 指向数组元素的指针 312
13.6.2 指针和数组 314
13.6.3 数组初始化 316
13.6.4 指针问题 316
13.7 实例:回文 319
13.7.1 使用string实现回文 319
13.7.2 使用数组实现回文 320
13.7.3 使用指针实现回文 321
简单练习 321
思考题 322
术语 323
习题 323
附言 324
第14章 向量、模板和异常 325
14.1 问题 325
14.2 改变大小 327
14.2.1 表示方式 327
14.2.2 reserve和capacity 328
14.2.3 resize 329
14.2.4 push_back 329
14.2.5 赋值 330
14.2.6 到目前为止的vector类 331
14.3 模板 332
14.3.1 类型作为模板参数 333
14.3.2 泛型编程 335
14.3.3 概念 336
14.3.4 容器和继承 338
14.3.5 整数作为模板参数 338
14.3.6 模板实参推断 340
14.3.7 泛化vector 340
14.4 范围检查和异常 342
14.4.1 旁白:设计上的考虑 343
14.4.2 坦白:使用宏 344
14.5 资源和异常 345
14.5.1 潜在的资源管理问题 346
14.5.2 资源获取即初始化 348
14.5.3 保证 348
14.5.4 unique_ptr 349
14.5.5 以移动方式返回结果 350
14.5.6 vector类的RAII 351
简单练习 352
思考题 353
术语 354
习题 354
附言 355
附录A C++语言概要 356
附录B Visual Studio简要入门教程 395
术语表 398
参考文献 402

教学资源推荐
作者: Frank L. Friedman;Elliot B. Koffman
作者: 陈帆 和红杰 周荣辉
作者: (美) Bruce Eckel
作者: 宋晓宇
参考读物推荐
作者: (美)Doug Hellmann
作者: 陶国荣 著
作者: (美)Steven L.Halter, Steven J.Munroe