C++程序设计教程(第3版)(通用版)
上QQ阅读APP看书,第一时间看更新

第3版前言

人工智能发展的大势

人工智能代表了人类科学发展的前沿领地,C++与其关系密不可分,所以本教材系列的出版有人工智能发展背景的一席之地。

人工智能目前尚处初级阶段,但其研究所派生的应用已经硕果累累,正在快速地改变我们的生活。人工智能解读医学拍片的本领已经比医生高;查阅法律证据的能力也比律师强;飞机及航空管理正在被人工智能替代;车辆行驶人工智能系统比人的操纵更好;搜索引擎中的人工智能可以分析照片,告诉你照片里面的故事。在线地图、数码相机、自动驾驶、无人超市、无人餐馆、无人银行等,今后甚至桩桩、件件、处处都可装智能芯片,从而纳入人工智能管理。

人工智能最关心的是人工自主意识,目前网络和计算机已经完成了知识的检索和存储,几大搜索引擎也完成了关键字-关联解释的功能和海量数据积累,大多数机器人厂商已经完成了反应机、自适应等高级功能,但却还没有能通过图灵测试的真正的人工自主意识。当然人类对自身意识的研究水平制约着人工智能的实现,人工智能的应用还可反哺于人类对自身意识的研究。

人工智能或许认为,神经网络系统只有复杂到一定程度,且在大尺度上的相似性保持高度一致,其个体自然产生的意识才会具备类似神经网络个体的认同和感知。但在技术上,意识只不过是人造神经网络中诸多需求反馈链交错所致。所以,人们通过研究人类神经网络的构成分布、互联网的社会化训练过程,“自然产生”个体意识。但实际上目前网上的软件自动机和各种设备产生的不知名网络现象,即所谓自主意识,因还无法被人工智能所感知,只被当作不知名故障进行“修复”处理,自当无解。

人工智能又或许认为,可以通过人工制造的智慧个体(机器人),在初期表现出类似创造者的行为和意识,再慢慢地进化。“机器学习“和“深度学习”被证明是个有效的手段,但受限于机器人硬件发展和大数据,前路漫漫。况且面临着神经反馈网络发展的实际问题,进化过程中的数据“过载”或“饥荒”会导致行为和意识的随时失却。

然而人类正在不依不饶地解决人工智能的关键问题:机器人的行动能力和对环境的视觉、听觉、触觉、嗅觉感知能力都在快速增强,智能推演之,则机器人就可自行获取运行的能源;软件自编程系统逐渐实现的自继承、自升级和自恢复,可以使机器人自我修复和完善;人类所掌握的全方位机器人设计、生产、测控在逐渐人工智能化,总有一天,机器人可以自行复制。

未来的人工智能发展速度将呈指数级攀升,将有越来越多的机器人通过图灵测试而具意识。一旦人工智能具有创造性思维,其发展将促进人类的巨大科学进步。显然,人工智能离不开计算,其需要远远大于现有的计算能力,除了期待量子计算机外,还需要有高可靠性的软件架构和高性能算法,这便需要千锤百炼的编程语言和纵横交错的软件工具。

C++发展与地位

C++在1998年制定了一个里程碑式的C++98国际标准,确立了C++语言的强势地位。之后,C++标准每年修订,2011年制定的C++11标准,使得C++的强类型特征得到了充分的体现,模板编程规范渐趋成熟。C++11标准再次深度影响了C++编译器的变革,其发展无时无刻不在说明其语言的完美缔造。

C++充分继承了C,保持了与硬件的亲和性,在此基础上,有机结合了诸多编程方法,兼容C的过程化编程框架,实现了面向对象的高效设计,又开辟了可自动生成的模板编程架构,在程序设计语言界绝无仅有。C++是当前使用最广泛的软件工具之一,其实现技术含量最高,应用于最重要领域。C++给我们搭建的软件架构,得以让人类展开多层次的人-人、人-机的互动设计,其正完美地表现出作为人类自然语言的化身角色。

从另一个角度来说,C++编程本身就是在撰写一篇优美的诗文,叙述一个精彩的故事,谱写一首动听的曲子。随着韵律和情节的跌宕起伏,什么时候故事讲完了,代码也就收尾了。好文章语义清晰、简练生动、词藻华美、引人入胜;好代码通俗易懂、结构清晰、层次分明、优化高效。因为C++独具多种编程方法,包揽从算法优化的微观细节,到模板架构的宏观布局,因而其开拓了编程中更广泛的遐想与表达的空间,C++编程充满美感。

微软操作系统及其架构,Apple的大部分底层软件,腾讯的QQ和微信,阿里云、百度云计算之底层架构,Google的Android底层架构,大部分数据库核心代码,几乎所有重要的系统,只要上规模,需要保证高可靠性,计较性能,无一不是用C++工具搭建。

正因为C++继承了C的衣钵,充分实现与系统硬件的无缝对接,追求高效率编程,才使得人工智能兴起的今天,大量涉及硬件相关的软件开发,C++是首选;其在人工智能的软件架构中,核心的逻辑语义表达,不但描述能力无可挑剔,而且在性能和效率方面占尽了优势。

重量级IT企业在招聘大数据工程师时,机器人公司在招聘开发人员时,都把C++编程作为必备能力。目前在中小学教学的信息学与程序设计课程开设中,C++趋向于统一指定为高考入学备考科目。事实上,学好C++,再自学其他编程语言就很容易,反之则不行。

编程语言的世界排名前四名已经长时间被Java、C、C++、Python这4种语言所占据。Java因其应用面更广泛而持续居于榜首,但在人工智能领域,Python编程相比Java,或许更加清爽、整洁、漂亮,其跃居前四,又有后来居上之势。人工智能也带来了C++的再次繁荣,从某种程度上说,Python编程只是在搭建软件的外包装,而C++才是其核心。C++与C在占据系统底层应用方面没有什么差距,但是在规模化编程、自动生成、实现系统架构方面,非C++莫属。况且由于C++源自C的特点,C编程往往又是在C++平台中实现。追本溯源,C++语言才是当今人工智能大发展上最重要的工具。

改版框架

本教材系列进化到第3版,是作者20多年C++教学研究与实践的总结。改版之后,每本主教材的框架结构没有变,所以遵循原编排特点、内容特点、学习方式。但毕竟编程应用需求形势大变,C++的地位攀升,急需权威的C++教材主导C++的编程教学,故而第3版各版本的名称拟定、排版、内容都作了较大更新。

第3版中各版本一律改用双色文字排版,代码以及关注文字用另一种颜色和底纹凸显,从根本上改变了排版式样,可读性得以显著提升。

第3版中各版本的内容在原书的基础上修改提升,涉及内涵深度、风格表现、描述侧重点等诸多不同。其版本名称见表1。

表1 第3版版本框架

*指原书未出版。

第3版的通用版:侧重C++基础,主要从概念着手,介绍C++编写程序的技法,强调编写正确的程序。学习之后,应当能了解C++是怎么回事,能解决什么问题,能看懂C++程序,了解C++的诸多技术特征,能编制一些简单的C++程序,能发现一些常规的C++错误,了解不同的程序设计方法,对面向对象程序设计方法及其特征有一个基本的了解,具备进一步学习后续课程(如数据结构、算法分析与设计)的基础。

第3版的竞技版:侧重C++分析设计技术,从实战训练着手,介绍C++的各种编程策略与技术,引导对数学及算法学习的重视,强调编写高效的程序。学习之后,应当能掌握基本的问题分析方法,掌握解决问题的设计技术;了解编程过程中的许多难点,深切体会细节决定成败;能够学习且具备参加各个层次程序设计竞赛的能力;对C++能解决什么问题的能力有全新的看法,进一步了解面向对象程序设计的方法;学会层次分析和功能拆解,具备独立设计一个规模较大的程序的能力;具备语言学习的独立能力。

第3版的专业版:一方面对竞技版的C++分析设计技术从底层的内存布局、编译器类型识别、各项技术相互关联等进行深度解析;另一方面介绍C++新标准及其新编译器所涉及的技术,以纵向视角来审视C++的未来发展,更全面地了解C++的实现技术,全面了解面向对象程序设计方法和技术,产生对高级模板编程的兴趣。虽然本版本未必能成为高校C++课程学习的主流,但是将其作为参考,可以作为国外诸多C++优秀教材之补充。

通用版、竞技版、专业版编纂目的不同,学习目标不同,但3个版本都出自同一起点——“Hello World”。每个主教材版本独立成体系,保证概念的正确性和前后连贯性,而又相互补充,展示C++不同的发展阶段,也展示不同的目标要求,满足了不同学习能力的读者的学习需要。对于没有编程基础的读者,则适合从基础型教材的学习开始,逐渐进入实战型教材的学习训练,而将拓展型教材作为研读或参考教材,去领略C++前沿之精妙。

在上述3个版本主教材的基础上,所撰写的三大教材的统一的实验指导和习题解答,则适合作教辅资料。倘若没有基础版的学习,又无行家点拨,则后面的编程学习会具有一定的困难,这也是在教学过程中确实存在的问题。

第3版的教材与其他国内外教材最大的不同,是聚焦于培养读者的编程实战能力。C++语法现象的学习或许并没有面面俱到,但是运用C++的编程方法与技巧,实际地解决问题,却占有相当的篇幅。

本书技术特征

本书保持了原书的描述风格,知识密集型特征,将基本概念有效地划分为一个个独立块,形式多样地讲清,而形成结构清晰的亮点,独到地按从简单到复杂、从易到难循序渐进地推进各个章节。

成书较早而使用BC、BCB 6.0、VC 6.0这3种编译器。代码风格常有16位编译器的影子。例如,浮点变量采用float居多,未涉64位整型等。因反映的是C++98标准前后的内容,故与C结合得紧密些。改版后,代码重写而逐渐形成自己的风格,且全部符合C++98标准。然而,C语言描述习惯的痕迹仍在。例如,变量定义统统放在块首,for循环变量仍早在for之前定义。

改版坚持把概念准确放在第一位。书中调整了个别章节,例如,在第11章添加了“名字识别”这一节,将原第17章的“多重继承”并到了第16章,而原第16章的“多态”和“抽象类”独立出来成为第17章。特别在面向对象程序设计部分,修改和明确了多处原概念模糊不清的地方。例如,模板类与类模板的区别,以及与类模板实例的差别,私有继承与保护继承的概念,多态的目的,继承与组合的差别与联系,等等。调整之后,理顺知识、归类概念变得更加自然。

改版继承了原书诸多优点。例如,在实例应用方面,强调完整实现,除了连贯地使用了单一问题描述的系列解决方案Josephus之外,还对诸多排序方法以及链表算法作了详细的描述;关于字串处理,从字符的数组、指针、库函数,到输入/输出,甚至字串流,代码全部使用C字串,系统滤清了C字串的概念;书中重视操作符重载,用了许多实例,滤清了多种单目操作符和双目操作符的用法和使用误区;书中对“引用”概念单辟一章来写,专述其原理及使用;此外,注重描述一些重要概念,如左值、类型相容及显隐式转换、表达式副作用等,这些都是编程最容易误解或出错之处,构成C++进阶的重要基础。

因通用版关乎C++基础,故未涉及C++STL概念,也未述及string字串。其编程尚停留在程序正确性之品质要求。面向对象程序设计概念也需要后续版本进一步展开。例如,在多态编程中,仅简单叙述多态对象类型转换的概念。

教材注重能力培养的理念与架构,必然在课程教学中从事问题驱动的教学模式,重视实践环节的设计和辅导,故在前言后面的附表中列出了课程教学的全程视频对应表,读者可扫描封底的刮刮卡观看教学视频。本书还提供电子课件和程序源码,读者可以扫描封底的课件二维码下载。

温馨致谢

世界真奇妙,人逢知天命之年,却还百般任性,人的劣性也由此爆发,各种不顺都来围剿,整天疲于应对琐事,因而我放弃了写书。不料,出版社的魏江江,一句希望,一句怂恿,把我封存在心的C++情结给钓了出来。回想这改版啊,本来就是我的梦。终于2018年的9月,决定要做改版的事。

编辑王冰飞,诸多鼓励和建议,洋溢着热情与幽默,以及印象深刻的高效工作,让我感受到C++教材撰写工作的崇高。教材的受益群体,从中小学生、大学生到程序员,都需要提升编程能力来强化自己的内涵和跟进现实世界,以致我认定了意义,直奔赶进度的节奏而去。

家人默默的生活支持,酿成了一种影响力,一句“快写C++”的催促,将本不起眼的几个音节,窝成了一个大大的推波,汹涌地扑在我的心上。

诸多同事,C++的OPS(Online Programming Space在线编程天地)提交系统维护者刘端阳和陈波老师,还有与我抱团的张永良和王英姿老师,共同实施了C++精品课程的编程能力训练。还有我的整个C++教学团队,学院教学院长江颉老师从一开始就是C++能力培养型教学的支持者,课程教学责任人龙胜春老师的虚心求教的启示及平时给予我很多的关照,毛国红老师对我的C++程序设计试卷提出的精益求精的见解,等等,恕不一一列出。他们都是我教材撰写的促进者。

在我内心深处,还有一种更原始的动力,来自恩师王国东先生,他是我的人生导师,我能得以轻轻放下,又重拾信心,拣起改版一事;他更是我长此以往写C++教材时的诸多灵感与智慧的源泉,系列成书,功不可没第一人。

钱 能

于杭州自在居

2019年除夕