1979年,Bjarne Stroustrup(C++之父)正在准备他的博士毕业论文,他有机会使用一种叫做Simula 的语言。顾名思义,Simula语言主要用于仿真。其Simula 67版被公认是首款支持面向对象的语言。Stroustrup发现面向对象的思想对于软件开发非常有用,但是因Simula语言执行效率低,其实用性不强。于是他决定自行开发一种面向对象的语言,这就是今日的C++。
我一直关心TOIBE社区的程序设计语言排行榜,因为它能为开发和教学人员提供一份程序设计语言的行情变化资料。如图1所示,在这个排行榜上发生了戏剧性变化的程序设计语言就是C++。其第一次戏剧性的变化发生在2004年,在这一年中它的市场份额急剧下滑。但在之后的十年间基本稳定,一直保持在第三位上。本书的第1版就是在这样的情况下编写的。其第二次戏剧性变化是在本书第1版出版之后,它先在2014年间急剧下跌,又在2015年奇迹般地回归。
图1 2015年6月的TOIBE程序设计语言排行榜
C++的这些变化似乎有些莫名其妙,但认真地分析一下,这些变化还是非常有理由可以解释的:其一是其他新兴语言(主要是C#和Object-C)对于市场份额的分割,其二则是其自身标准变化的影响。下面主要分析一下第二方面的因素。
C++是Bjarne Stroustrup(后面简称BS)于1979年准备一个项目时着手开发的一种程序设计语言。1985年被市场化。C++标准委员会于1998年11月推出了其第一个ISO标准(俗称C++98),2003年推出其ISO标准第2版(俗称C++03),C++11则是从2005年就开始提交,到2011年8月才发布的C++标准(俗称C++11,提交时称为C++0x)。从图1可以看出,每个标准出台到影响其市场份额有一个窗口期,这是该标准投石问路的过程。
C++03是C++98的修正版,其初衷是修正C++98的一些不足。但是由于C++脱胎于C,遵循着C是C++子集的原则,同时BS坚持要保持其“适合教学”和既支持面向过程又支持面向对象的多泛型(过程化程序设计、数据抽象化、面向对象程序设计、泛型程序设计)特色,成就了其概念清晰、设计严密、功能强大、效率较高的优点,但也带来过于复杂(如指针)、标准库苍白的不足,被人称为有精英化倾向的语言。因此它比较受教育界欢迎,程序员觉得难用。不过,在通过C++03标准之前,人们还没有认识到这些问题,反而降低了效率,加剧了其缺陷的影响,使Python等语言乘虚而入,使其在2004~2005年间遭受到第一次强力冲击。
2004—2005年间的滑铁卢之惨使C++的设计者和标准制定者开始清醒起来,将指导思想修订为:
* 维持与C++98,可能的话还有C之间的兼容性与稳定性;
* 尽可能通过标准程序库来引进新的特性,而不是扩展核心语言;
* 能够促进编程技术的变更优先;
* 改进 C++ 以帮助系统和程序库的设计,而不是引进只对特定应用有用的新特性;
* 增强类型安全,给现行不安全的技术提供更安全的替代方案;
* 增强直接与硬件协同工作的性能和能力;
* 为现实世界中的问题提供适当的解决方案;
* 实行零负担原则(如果某些功能要求额外支持,那么只有在该功能被用到时这些额外的支持才被用到);
* 使C++易于教学。
简单地说,就是技术先进并向安全高效、方便易用迈进。这带给程序员一个全新的面貌,以至于连C++之父都说它像一种新语言。C++11成功了,它使C++摆脱了连续十年的步步下降,造就了TIOBE曲线2015的戏剧性变化。
如图2所示,C++11已经公布四五年了,新的C++14也已经公布,C++17也在紧锣密鼓地部署之中。但是我国的C++程序设计教学的主流还停留在原始的C++98甚至更旧的版本上。如此严重脱离实际的状况到了做出改变的时候了。这是本人对这本C++教材进行改编的动因之一。
图2 近期C++标准修订步伐
不过,世界万物都有惯性。要一下子全部改到C++11上,很多人还是难以接受的,并且我自己也还在学习消化之中。在本书中,仅仅给出了C++11的部分新特点的接口,先让大家了解一下这些性能。在适当的时候,再做较全面和深入的介绍。
(二)
撇开C++11和C++14不谈,光从一般性来讲,目前的C++教学也是不尽如人意的,把C++当作C用的教学模式还广泛存在。在本书的第1版中虽然做了不少努力,但还不够。
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++特色,也是本书改编的重要动因。
(三)
本次修改,将全书划分为4篇。
第1篇:C++面向对象起步。用4个单元帮助初学者建立面向对象的问题分析思维,掌握相关方法和相关知识,树立面向对象程序设计中“一切皆对象,一切来自类”的意识。
第2篇:基于类的C++程序框架设计。用3个单元帮助读者理解如何在一个程序中组织类以及什么样的类结构才是好的程序结构,进一步提升读者“程序设计 = 计算思维 + 语言艺术”的观念。
第3篇:C++泛型程序设计。用3个单元介绍重载、多态和STL。C++的泛型、通用、灵活的特点给读者的学习带来了一定乐趣,也为读者将来从事程序开发工作提供了更多便捷方法。
第4篇:C++深入编程。用4个单元介绍C++在名字和实体、常量、函数、I/O流等几个方面的细节,让读者在程序开发上能够做到锦上添花。
此外,本书每个单元都围绕一个主题展开,部分单元还增添了知识链接部分,其目的是引申基本内容,或为以后的学习作一些铺垫。
这样的结构体系安排,是考虑了以下几个因素和写作思想的结果。
(1)S.D的建议。
(2)重要先学,特色优先。
(3)思维开路,语法补充。
(4)多层次教学需要。
需要说明一点:本书给出的许多示例,虽然有用,但主要用于说明一种语法概念或给出一种编程思路,还不是精益求精的实用程序。
(四)
赵忠孝教授、姚威博士、张展为博士以及张秋菊、史林娟、张有明、戴璐、张展赫、董兆军、吴灼伟(插图)等参加了有关部分的写作。在此谨表谢意。同时,一如既往地希望得到读者广泛的批评和建议,以便将这本书改得更好。
张基温
乙未夏于小海之畔??