第二版前言
计算机科学与应用的迅猛发展,直接推动了《C++程序设计教程》一书的再版。C++技术正突飞猛进,日臻完善,而人们也越来越多地需要更强有力的计算机语言工具帮助描述和解决实际的问题。基于此,新版在各方面较之第一版都作了大幅度的修改:在指导思想上,更加强调以培养具有实际编程能力的程序员为主要目标;在内容结构上,增强了描述的层次性,从编程基础、过程化编程、对象化编程,到高级编程的渐进,界限分明而又自然过渡;在写作特点上,其通俗易懂性较之第一版有过之而无不及;在使用范围上,它主要面向大学生、研究生、教师和科研工作者。由于本书自成体系,又辐射到计算机专业诸课程,所以对完善读者的计算机知识体系也大有裨益。
C++的权威
计算机应用普及中,有两种学习内容:一种是学习其操作方法,一种是学习其开发方法。前者是学会如何使用计算机,将计算机作为工具,产生直接的经济效益;后者是通过在计算机上的创新活动,让计算机学习,以使计算机更"聪明"。显然后者需要付出更多的努力,也需要更多的计算机科学知识,当然可以产生更多、更大、更深远的经济效益,而且开发实践又会驱使其对计算机进行更深层次的研究。C++的编程学习是后者的一种入门。
在我国,计算机的发展还落后于发达国家,甚至还赶不上印度、新加坡。中国要实现软件产业大国的梦想,需要大量的高级程序员和软件工程师。程序设计语言的学习与运用是一个重要的契机。现在,大学计算机专业一年级必开程序设计课,甚至中小学的计算机兴趣小组和计算机信息学竞赛也要进行计算机编程。使用C++作为学习和开发的语言在我国不断得到升温,而且,是否会编程俨然成了懂不懂计算机的一种标志了。
无论搞开发,还是搞研究,对程序设计语言的使用有着同样高的要求:要能够有很好的可靠性、高效率,可以在不同平台上移植,有尽可能多的语言内容标准化,支持数据一致性,支持程序描述的简捷与清晰,风格自然。而这些,都是C++语言的外在特点。C++既是设计工具,又是实现工具,既可抽象概念,描述实际问题,又兼顾效率,能很好地实现底层的系统软件。
C++和Java是当今两大热门编程工具,目前世界上90%以上的程序员用C++或Java作为工具,这足以说明C++在当今计算机科学研究和软件开发中的地位。C++是现代程序设计语言,它在语言设计上已经非常充分,其最初的国际标准也早在1998年就已确定。就影响力而言,它超过了以往任何其他程序设计语言。
现代程序设计语言的一个重要特征是层次分明的抽象编程能力,高级与低级编程融为一体。语言的高级性,在于它能够高度抽象地描述事物,其描述的过程实际上是在分离与协调不同的抽象层次;然后通过结构的组织,汇成了程序;又通过编译器的作用将程序整体转化成与低级语言程序等价的机器代码。这意味着:任何一个计算机所要完成的足够复杂的问题总是可以不断抽象,直至每个人都能明白的简单过程描述。
因此,理解并充分实践了C++的过程、函数,就可以抽象到类,再抽象到使用类的编程,直至面向对象的编程描述,一步比一步更抽象;同样,理解了程序运行的计算机内存布局,语言的编译及设计,就可以很好地工作在过程、函数和类的交叉作用下的编程调试之低层抽象中。所以,C++程序员可以同时处在开发环境的高、中、低不同抽象层次上工作。
第二版的改进
1.技术参照的变更
前C++ 语言继承了C,标准C++又从前C++中来,标准C++具有更强的移植性,能够更抽象和便捷地编程。本书以标准C++技术为蓝本,以Java技术为参照,以前C++为过渡和比较,在一些涉及性能比较方面还会提及C。而第一版则以C为背景,用前C++作蓝本,以标准C++作参照。
2.内容增补
在内容结构上,加强了基于对象编程,完善了面向对象编程,补充了高级编程。
为了淋漓尽致地体现C++的优越性能,展示充分利用时空资源的编程手法,增辟了性能这一章;补充了具有底层编程特色的位操作;新添了名空间和类型转换;增添了许多标准模板类库的使用实例;界面属于技术紧要处,所以对之展开了细节描写;特别是在第四部分,还用浅显的道理介绍了诸如手柄类、引用计数、类工厂等高级编程技术;增补异常设计技术,使之实用化。
3. 结构重组
考虑到一些内容的分量比重,便不再单独成章:过程化编程中有数组、指针、引用和结构,对象化编程中有堆与拷贝构造函数、静态成员和友元、多重继承、操作符重载和IO流。
由于实验中输入输出的数据设计特别重要,所以全书普及了文件流基本操作。
以基本编程语句,数据类型和计算问题的章节顺序来叙述,同时还归类了过程化编程的诸种方法,这完全是教学经验的总结。因为学了简单的编程语句便可以立即进行过程控制结构的实验,以感性认识引导理性认识的方式在C++学习上能更有效地被学生接受。
4.强调抽象编程
抽象编程是指采用抽象分层的手法,进行各个模块的具体编程。抽象编程并不是动动脑,动动嘴,比划比划的形式,而是更有效地进行的具体编程。要实质性地提高编程能力,必须学习C++的内部实现技术和抽象表达手段,两者并重。面向对象编程的主要手段就是抽象编程,书中强化了C++的抽象表达技术,特地将多态和抽象类拎出来单独成章,而第一版在抽象表达手段上明显不足。
5. 代码重写
第一版中所有过程化和对象化代码在再版中都用标准C++彻底重写,并大量增补了高效和精巧的程序代码,特别是抽象编程代码。在例子中,力求代码的完整性。此外,还增加了习题数量,第6章习题涉及一些内部实现技巧和数学理论,所以还列出了难度等级。
6.更新配套教材
《C++程序设计实验指导》将更名为《C++课程设计指导》,更新C++的实验环境,进行范围更广的编程指导,并充实《C++程序设计习题与解答》。
内容·特色·导读
1. 全书以递进情节展开
第一部分程序设计基础,分四章,描述概述,基本编程语句,数据类型和计算表达。其中基本编程语句和数据类型为重点,它们一个为算法描述的基础,一个为数据结构和抽象数据类型描述的基础。
第二部分过程化程序设计,分三章,描述函数机制,性能和程序结构。其中函数机制和程序结构是重点,前者描述过程,后者描述过程组织。
第三部分面向对象编程基础,实际上就是基于对象的编程方法,分四章,描述类,对象生灭,继承和基于对象编程。前三章对类机制作了全面描述,后一章是基于对象方法的一个归纳和实例。
第四部分高级编程,分四章,描述多态,抽象类,模板,异常。多态和抽象类是面向对象编程的核心内容,模板论述了泛型编程,异常则强化了面向对象编程中的可靠性和容错性。
2.授课时数参考
本书在内容上是跨程序设计基础,过程化编程,对象化编程和高级编程的四合一。可以选择进行其中的第一、二部分,或第三、四部分的教学。第一、二部分和第三、四部分分别可以作为一学期约80个理论实践课时的教学,其中上机实验可占到24~40学时不等。
3.改革课程教学
打破旧式教学的刻板模式,致力于消除计算机专业的学生在大学毕业后,却不会编程的普遍现状。将程序设计课程的教学要求和目标牢牢钉在编程能力而不是应付机械式考试上,强调程序设计课程应充实更多的编程实践,让更多有编程经验的教师来讲解和指导实验,并要求以实际的编程活动来确认是否掌握了所学内容和方法。而第一版还留恋着计算机等级考试。当然,学好了C++的编程技能,考试亦会得心应手。
4.学无止境观
学过一些C++的人,已经不满足于过程化编程了,而且仅有一些对象化编程的思想也已经不过瘾了,最好能充分利用C++的标准库资源,并且实践真正的面向对象编程。他们还觉得即使是过程化编程,真的要体现其性能效率各方面,也不那么容易。C++难就难在对内部特性的把握,而且C++发展太快,新特性太多,需要滚动式的经验积累和长期的实践,才能洞察其本质,需要对大量优秀设计实例的学习,才能领悟其真谛。
5.代码说明
书中凡是编号的程序代码,都是完整的可运行程序,可在清华大学出版社的网站http://www.tup.com.cn下载。书中的每个程序代码都经作者亲手在Borland C++ Builder 6.0的环境上调试 。代码从性能和易读风格上力求精简,但有时性能和风格并不调和,因此,有些代码会很奇异,甚至个别代码会有些晦涩难懂(相对初学者来说),把这些悬念留给亲爱的老师来解释吧,以使课堂教学更加精彩。也把这些代码留给大伙儿一起品味吧,那是共享精华的地方。然而,终究还有不足之处,只能让读者们一起来帮助作者提高了。
6.由欣赏初级精彩到享受内在精彩
目前市面上,C++的书籍很多,真是眼花缭乱,有很多是国外名家写的经典之作,但初学者看了很难有大的收获,而有过一些开发背景的读者看了会觉得很精彩,感到真是一种享受。到了"享受"这个层次,学习C++就无障碍可言了。本书旨在引导初学者,学会欣赏C++学习的初级精彩;然后根据作者的指引,直接去享受C++经典著作的内在精彩。
7.评鉴书中观点
书中经常出现程序设计方法的多样性探讨、语言特征上的优缺点描述及编译工具评价等,甚至对C++中的一些名词和术语进行了自以为更确切的中文命名。作者不隐晦自己的观点,更欢迎专家来信探讨。对于计算机教师和高级程序员来说,应是一种有益的参考。
8.整体关联
书中内容自成体系,各章各节互相参照,若超前引用后面的知识,则将以后面的章节号指引读者参考某个细节。程序设计课程与计算机的其他课程有许多内在的联系,书中将以指引参考文献的方式引导读者进一步阅读。同样,涉及一些高级C++技术的时候,也以参考文献的方式指引读者阅读经典读物。附录中附有C++语法导读、常用标准库使用方法、参考书目以及索引,它们是读者学习的好帮手。
温馨致谢
全国各地的读者甚至海外华人对我的第一版给予了高度评价,他们的支持、鼓励和催促,是我再版的强大动力。同时他们还提出了许多宝贵意见和建议。无疑,他们推进了再版的撰写质量,并影响了书稿风格。他们所提的问题,许多都成了书中细节描写的亮点。
浙江工业大学的教学大课堂给我提供了教学实践的场所。学生们虚心求教的态度感动了我,使我下决心一定要搞清原来还不十分清楚的概念,也一定要调通那些稀奇古怪的源代码。他们追问我的问题,带给我长久的思考,于是,书稿轮廓也就慢慢地清晰起来了。
ACM/ICPC(国际大学生程序设计竞赛)培训是我的另一项积累教学经验和获得程序实例的工作。学生们学了一年的编程课程,转到竞赛培训中来,似乎仍是从零开始。它让我确信,实践环节对初学者来说,是多么重要,也就更坚定了我强调实践的宗旨。
一些学生得知我在撰写书稿,主动要求"先睹为快",他们阅读了部分书稿,并提出了修改意见,使我少走了许多弯路。
许多同事关心此书的早日付印,给了我春天般的温暖。它温馨地提请我不要浪费宝贵的光阴。出版社也经常关心我的编写进度,令我无以逃避,只能坐下来,静心写作和调试代码。
C++的泰斗Bjarne Stroustrup虽未晤面,但其经典之作《C++ Programming Language》始终在我脑中萦绕,给了我摧破任何技术障碍的力量。
我感到欣慰,因为我能为国家,为读者作出一点贡献,也因此感谢所有赋予我灵感和力量的人们,我更以无限之情,感激终于成就此书的天时、地利、人和。路漫漫,我当继续努力,不负众望。
作者的电子邮件地址是:
qianneng@mail.hz.zj.cn
钱 能
2005年春于杭州