前??言 (一) 1979年,Bjarne Stroustrup(C++之父,后面简称BS)正在准备他的博士毕业论文,他有机会使用一种叫作Simula 的语言。Simula语言主要用于计算机仿真,其67版被公认是首款支持面向对象的语言。Bjarne Stroustrup发现面向对象的思想对于软件开发非常有用,但是Simula语言执行效率低,实用性不强,于是他决定自行开发一种面向对象的语言,这就是今日的C++。 1979年Bjarne Stroustrup在准备一个项目时,基于C语言开发出了一种程序设计语言,将其称为C++。1985年C++被市场化。1998年11月C++标准委员会推出了第一个ISO标准(俗称C++98),2003年推出ISO标准第2版(俗称C++03)。 C++03是C++98的修正版,其初衷是修正C++98的一些不足。但是由于C++脱胎于C,遵循C是C++子集的原则,同时Bjarne Stroustrup坚持要保持其“适合教学”,以及既支持面向过程又支持面向对象的多泛型特色,造就了其概念清晰、设计严密、功能强大、效率较高的优点,但也带来过于复杂(如指针)、标准库苍白的不足,被人称为有精英化倾向的语言。因此,它比较受教育界欢迎,而程序员觉得难用。不过,在通过C++03标准之前,人们还没有认识到这些问题,反而降低了效率,加剧了其缺陷的影响,Python等语言乘虚而入,使其在2004年遭受到第一次强力冲击。 2004年的滑铁卢之惨使C++的设计者和标准制定者开始清醒起来,将指导思想修订 如下。 (1)维持与C++98,可能的话还有C之间的兼容性与稳定性。 (2)尽可能通过标准程序库来引进新的特性,而不是扩展核心语言。 (3)能够促进编程技术的变更优先。 (4)改进 C++ 以帮助系统和程序库的设计,而不是引进只对特定应用有用的新特性。 (5)增强类型安全,给现行不安全的技术提供更安全的替代方案。 (6)增强直接与硬件协同工作的性能和能力。 (7)为现实世界中的问题提供适当的解决方案。 (8)实行零负担原则(如果某些功能要求额外支持,那么只有在该功能被用到时这些额外的支持才被用到)。 (9)使C++易于教学。 简单地说,上述这些思想可以归结为:技术优先、安全高效、自由方便。这带给了程序员一个全新的面貌,以至于连C++之父都说它像一种新语言。2011年8月C++11成功了,它使C++摆脱了连续十年在TIOBE曲线上的步步下降的局面。 如图1所示,C++11已经公布近10年,新的C++14、C++17、C++20也已经公布。每一次更新,它都会汲取其他程序设计语言中的一些优势机制,并创造出其他程序设计语言所不具备的一些精彩华章,把程序设计技术带入一个新的高度。因此,学习C++与学习其他程序设计语言的不同之处在于,用它不仅可以开发出难度很高的软件,更重要的是它可以给计算机专业的人员许多启迪。 图1 近期C++标准修订步伐 不过,世界万物都有惯性。要C++教学与开发用户一下子全部改到C++最新标准上,很多人还是难以接受的,并且我自己也还在学习消化之中。在本书中,仅仅给出了C++11的部分新特点的接口,先让大家了解一下这些性能。在适当的时候,再做较全面和深入的介绍。 (二) 先撇开C++11、C++14、C++17和C++20的新特性,就从把C++当作C用的教学模式还广泛存在这一点看,我们的C++教学确定应当改进了。 Bjarne Stroustrup曾经感慨地说:“我不是使用支持工具进行巧妙设计的信徒,但是我强烈支持系统地使用数据抽象、面向对象编程和类属编程。不拥有支持库和模板,不进行事先的总体设计,而是埋头写下一页页的代码,这是在浪费时间,这是在给维护增加困难。”他还认为,“一个人对C 了解得越深,在写C++程序时就越难避免C 的风格,并会因此丢掉C++的某些潜在优势。”为此,他提出了以下几个相关的要点。在这些情况下做同样的事情时,在C++里存在比C中更好的处理方式。 (1)在C++里几乎不需要用宏。用const或enum 定义显式常量,用inline避免函数调用的额外开销,用template去刻画一族函数或者类型,用namespace 去避免名字冲突。 (2)不用在需要变量之前去声明它,以保证立即对其进行初始化。声明可以出现在能出现语句的所有位置上,可以出现在for语句的初始化部分,也可以出现在条件中。 (3)不用malloc(),new 运算符也能将同样的事情做得更好。对于realloc(),请试一试vector()。 (4)试着去避免void*、指针算术、联合和强制,除了在某些函数或类实现的深层之 外。在大部分情况下,强制都是设计错误的指示器。如果必须使用某个显式的类型转换,设法去用一个“新的强制”,设法写出一个描述你想做的事情的更精确的语句。 (5)尽量少用数组和C风格的字符串。与传统的C风格相比,使用C++标准库string和vector常常可以简化程序设计。如果要符合C的连接规则,一个C++函数就必须被声明为具有C连接的。 最重要的是,要将程序考虑为一组由类和对象表示的相互作用的概念,而不是一堆数据结构和一些去拨弄数据结构中二进制位的函数。 探索如何彰显C++特色,也是本书改编的重要动因。 (三) 本次修改,将全书划分为3篇。 第1篇:C++命令式编程。用4章内容帮助初学者建立面向对象的问题分析思维,掌握相关方法和相关知识,树立面向对象程序设计中“一切皆对象,一切来自类”的意识。 第2篇:C++面向对象编程。用3章内容帮助读者理解如何在一个程序中组织类以及什么样的类结构才是好的程序结构。 第3篇:C++泛型程序设计。用2章内容介绍模板和STL。C++的泛型以及通用、灵活的特点给读者的学习带来了一定乐趣,也为读者将来从事程序开发工作提供了更多便捷方法。 此外,本书每章都围绕一个主题展开,其目的是引申基本内容,或为以后的学习做铺垫。 这样的结构体系安排,是考虑了以下几个因素和写作思想的结果。 (1)Bjarne Stroustrup的建议。 (2)重要先学,特色优先。 (3)思维开路,语法补充。 (4)多层次教学需要。 需要说明一点:本书给出的许多示例,虽然有用,但主要用于说明一种语法概念或给出一种编程思路,还不是精益求精的实用程序。 (四) 由J.?Piaget、O.?Kernberg、R.?J.?Sternberg、D.?Katz、Vogotsgy等人创建的建构主义(constructivism)学习理论认为,知识不是通过教师传授得到的,而是学习者在一定的情境即社会文化背景下借助其他人(包括教师和学习伙伴)的帮助,利用必要的学习资料,通过意义建构的方式而获得的。在信息时代,人们获得知识的途径发生了根本性的变化,教师不再是单一的“传道、授业、解惑”者,帮助学习者构建一个良好的学习环境也成为其一项重要职责。当然,这也是现代教材的责任。本书充分考虑了这些问题。 为了给读者创造一个良好的学习环境,本书采用二维码链接的形式给出了一些“知识链接”,其目的在于扩展读者的视野,帮助读者了解C++某些机制的来龙去脉,也为精力充沛、不够消化者“加餐”。 此外,在相关章后面安排了概念辨析、代码分析、开发实践和探索验证4种自测和训练实践环节,从而建立起一个全面的学习环境。 (1)概念辨析主要提供选择和判断两类自测题目,帮助学习者理解本单元学习过的有关概念,把当前学习内容所反映的事物尽量和自己已经知道的事物联系,并认真思考这种联系,通过“自我协商”与“相互协商”,形成新知识的同化与顺应。 (2)代码分析。代码阅读是程序设计者所应掌握的基本能力之一。代码分析部分的主要题型是通过阅读程序找出错误或给出程序执行结果。 (3)开发实践。提高程序开发能力是本书的主要目标。本书在绝大多数单元后面都给出了相应的作业题目。但是,完成这些题目并非只是简单地写出其代码,而要将其看作一个“思维 + 语法 + 方法”的工程训练。因此,要求每道题的作业都要以文档的形式提交。文档中应包括以下内容。 ① 问题分析与建模。 ② 源代码设计。 ③ 测试用例设计。 ④ 程序运行结果分析。 ⑤ 编程心得(包括运行中出现的问题与解决方法、对于测试用例的分析、对于运行结果的分析等)。 ⑥ 文档的排版也要遵照统一的格式。 (4)探索验证。建构主义提倡,学习者要用探索法和发现法去建构知识的意义。学习者要在意义建构的过程中主动地搜集和分析有关的信息资料,对碰到的问题提出各种假设,并努力加以验证。按照这一理论,本书还提供了一个探索验证栏目,以培养学习者获取知识的能力和不断探索的兴趣。 (五) 本人从事程序设计教学近40年。这40年,是在不断探索中走过来的。从20世纪80年代末,本人就开始探索程序设计课程从语法体系到问题驱动的改革;到了20世纪90年代中期又在此基础上考虑让学生在学习程序设计的同时掌握程序测试技能;2003年开始考虑如何改变学习了C++而设计出的程序却是面向过程的状况。每个阶段的探索,都反映在自己不同时期的相关作品中。本书则是自我认识又一次深化的表达。 经过这40年的探索,我越来越感觉到编写教材的责任和困难。要编写一本好的教材,不仅需要对本课程涉及内容有深刻的了解,还要熟悉相关领域的知识,特别是要不断探讨贯穿其中的教学理念和教育思想。所以,越到后来,就越感到自己知识和能力的不足。可是,作为一项历史性任务的研究,我又不愿意将之半途而废,只能硬着头皮写下去。每一次任务的完成,都得益于一些热心者的支持和帮助。在本书的写作过程中,陶利民参加了部分写作工作。此外,张秋菊、史林娟、张有明、张展赫、戴璐等也参加了部分编写工作,以及有关材料收集、程序调试和文字校对工作。在此谨表谢意。同时,一如既往地希望得到读者的广泛批评和建议,以便将这本书改得更好。 本书就要出版了。它的出版,是我在这项教学改革工作中跨上的一个新的台阶。本人衷心希望得到有关专家和读者的批评和建议,也希望能多结交一些志同道合者,把这项教学改革推向更新的境界。 张基温 2021年3月于锡城蠡溪? ·I·