
本书荣获教育部全国高校优秀教材奖十一五普通高等教育“十一五“国家规划教材C++程序设计系列教材C++程序设计教程(第二版)钱能著清华大学出版社

第二版前言计算机科学与应用的迅猛发展,直接推动了《C++程序设计教程》一书的第二版。C++技术正突飞猛进,日臻完善,而人们也越来越多地需要更强有力的计算机语言工具帮助描述和解决实际的问题。基于此,新版在各方面较之第一版都做了大幅度的修改:在指导思想上,更加强调以培养具有实际编程能力的程序员为主要目标;在内容结构上,增强了描述的层次性,从编程基础、过程化编程、对象化编程,到高级编程的渐进,界限分明而又过渡自然:在写作特点上,其通俗易懂性较之第一版更上一层楼;在使用范围上,它主要面向大学生、研究生、教师和科研工作者。由于本书自成体系,又辐射到计算机专业的诸课程,所以对完善读者的计算机知识体系也大有神益。C++的权威计算机应用普及过程中,有两种学习内容:一种是学习其操作方法,一种是学习其开发方法。前者是学会如何使用计算机,将计算机作为工具,产生直接的经济效益;后者是通过在计算机上的创新活动,让计算机学习,以使计算机更“聪明”。显然后者需要付出更多的努力,也需要更多的计算机科学知识,当然可以产生更多、更大、更深远的经济效益,而且开发实践又会驱使其对计算机进行更深层次的研究。C++的编程学习是后者的一种入门。在我国,计算机的发展还落后于发达国家,甚至还赶不上印度。中国要实现软件产业大国的梦想,需要大量的高级程序员和软件工程师。程序设计语言的学习与运用是一个重要的契机。现在,大学计算机专业一年级必开程序设计课,甚至中小学的计算机兴趣小组和计算机信息学竞赛也要进行计算机编程。使用C++作为学习和开发的语言在我国不断升温,而且,是否会编程俨然成了懂不懂计算机的一种标志了。无论搞开发,还是搞研究,对使用的程序设计语言有着同样高的要求:要能够有很好的可靠性、高效率,可以在不同平台上移植,有尽可能多的标准化语言内容,支持数据一致性,支持程序描述的简洁与清晰,风格自然。而这些,都是C++语言的外在特点。C++既是设计工具,文是实现工具:既可抽象概念,描述实际问题,又兼顾效率,能很好地实现底层的系统软件。C++和Java是当今两大热门编程语言,它们各具特色。目前世界上90%以上的程序员用C++或Java的编译器作为工具,这足以说明C++在当今计算机科学研究和软件开发中的地位。C++是现代程序设计语言,它在语言设计上已经非常充分,其最初的国际标准也早在1998年就已制订。就影响力而言,它超过了以往任何其他程序设计语言。现代程序设计语言的一个重要特征是层次分明的抽象编程能力,高级与低级编程融为一体。语言的高级性,在于它能够高度抽象地描述事物,其描述的过程实际上是在分离与www.TopSage.com
www.TopSage.com

第二版前言II协调不同的抽象层次:然后通过结构的组织,汇成了程序;又通过编译器的作用将程序整体转化成与低级语言程序等价的机器代码。这意味着:任何一个计算机所要完成的足够复杂的问题总是可以不断抽象,直至成为每个人都能明白的简单过程描述。因此,理解并充分实践了C++的过程、函数,就可以抽象到类,再抽象到使用类的编程,直至面向对象的编程描述,一步比一步更抽象;同样,理解了程序运行的计算机内存布局,语言的编译及设计,就可以很好地工作在过程、函数和类交叉作用下的编程调试之低层的抽象中。所以,C++程序员可以同时在开发环境的高、中、低不同抽象层次上工作。第二版的改进1.技术参照的变更前C++语言继承了C,标准C++又从前C++中来,标准C++具有更强的可移植性,能够更抽象和便捷地编程。本书以标准C++技术为蓝本,以Java技术为参照,将前C++过渡为标准C++,并进行优劣比较,在一些涉及性能比较方面还会提及C。而第一版则以C为背景,用前C++作蓝本,以标准C++作参照。2.内容增补为了淋漓尽致地体现C++的优越性能,充分展示利用时空资源的编程手法,增辟了性能这一章;补充了具有底层编程特色的位操作:新添了名空间和特色类型转换;增添了许多标准模板类库的使用实例。界面属于技术紧要处,所以对之展开了细节描写。在第四部分,还用浅显的道理介绍了诸如手柄类、引用计数、类工厂等高级编程技术:增补了许多模板编程的高级技术,使其与面向对象编程相映成辉:还补充了异常处理的技巧,更加清晰地展现异常的魅力,使之实用化。3.结构重组在内容结构上,加强了基于对象编程,完善了面向对象编程,补充了高级编程。尤其是,对第一版的全部文字内容进行了重写。考虑到一些内容的分量比重,过程化编程中的数组、指针、引用和结构,对象化编程中的堆与拷贝构造函数、静态成员和友元、多重继承、操作符重载和IO流不再单独成章。这实际上是对全书做的大幅度的内容结构重组。由于实例中输入输出的数据设计特别重要,所以全书贯穿了文件流的基本操作。全书以基本编程语句、数据类型和计算表达的章节顺序展开叙述,同时还归纳了过程化编程的诸种方法,是作者多年教学经验的总结。学了简单的编程语句,随之展开过程控制结构的实验,以感性认识牵动理性认识,在C++学习上更能奏效,也顺应了教学规律。①这里把从C++的诞生到C++标准确立为止的历史阶段称为前C++。www.TopSage.com
www.TopSage.com

大家网第二版前言TopSage.com4.强调抽象编程抽象编程是指采用抽象分层的手法,进行各个模块的具体编程。抽象编程并不是动动脑,动动嘴,比画比画的形式,而是更有效进行的具体编程。要实质性地提高编程能力,必须学习C++的内部实现技术和抽象表达手段,二者并重。面向对象编程的主要手段体现在抽象编程,书中强化了C++的抽象表达技术,特地将多态和抽象类抽出来单独成章,克服了第一版在抽象表达手段上的明显不足。5.代码重写第一版中的所有代码在第二版中都根据C++标准彻底重写,并大量增补了高效和精巧的程序代码。在例子中,力求代码的完整性。此外,还增加了习题数量,第6章习题涉及一些内部实现技巧和数学理论,所以还列出了难度等级。内容·特色·导读1.全书以递进方式展开第一部分编程基础,分四章,包括概述、基本编程语句、数据类型和计算表达。其中基本编程语句和数据类型为重点,它们一个为算法描述的基础,一个为数据结构和抽象数据类型描述的基础。第二部分过程化编程,分三章,包括函数机制、性能和程序结构。其中函数机制和程序结构描述了过程和过程组织,而性能则展示了编程艺术。第三部分基于对象编程,分四章,包括类、对象生灭、继承和基于对象编程。前三章对类机制做了全面描述,后一章是基于对象方法的一个归纳和设计实例。第四部分高级编程,分四章,包括多态、抽象类、模板和异常。多态和抽象类是面向对象编程的核心内容,模板从模板机制一直描述到泛型编程,异常则主要描述其如何强化面向对象编程的可靠性和容错性。2.授课时数参考本书在内容上是跨编程基础、过程化编程、对象化编程和高级编程的四合一。可以选择进行其中的第一、二部分,或第三、四部分的教学。第一、二部分和第三、四部分分别可以作为一学期约64个理论实践课时的教学,其中上机实验可占到24学时左右。3.改革课程教学打破旧式教学的刻板模式,致力于消除计算机专业的学生在大学毕业后,却不会编程的普遍现状。将程序设计课程的教学要求和目标牢牢锁定在编程能力而不是应付机械式的考试上,强调程序设计课程应充实更多的编程实践,让更多有编程经验的教师来讲解和指导实验,并要求以实际的编程活动来确认是否掌握了所学内容和方法。而第一版还留恋着www.TopSage.com
www.TopSage.com

IV第二版前言计算机等级考试,当然,学好了C++编程技能,考试亦会得心应手。4.学无止境观学过一些C++的人,已经不满足于过程化编程了,而且仅有一些对象化编程的思想也已经不过瘾了,最好能充分利用C++的标准库资源,并且实践真正的面向对象编程。他们还觉得即使是过程化编程,真的要体现其性能效率各方面,也不那么容易。C++难就难在对内部特性的把握上,而且C++发展太快,新特性太多。只有滚动式的经验积累和长期的实践,才能洞察其本质;有了对大量优秀设计实例的学习,才能领悟其真谛。5.从初级精彩走向内在精彩目前市面上,C++的书籍很多,真是眼花缘乱,有很多是国外名家写的经典之作,但初学者看了很难有大的收获,而有过一些开发背景的读者看了会觉得很精彩,感到真是种享受。到了“享受”这个层次,学习C++就无障碍可言了。本书旨在引导初学者,学会欣赏C++学习的初级精彩:然后根据作者的指引,直接去享受C++经典著作的内在精彩。6.观点评鉴书中经常出现程序设计方法的多样性探讨、语言特征上的优缺点描述及编译工具评价等,甚至对C++中的一些名词和术语进行了自以为更确切的中文命名,对于计算机教师和高级程序员来说,应是一种有益的参考。作者不隐讳自已的观点,更欢迎专家来信探讨。7.代码特色书中的每个程序代码从性能和易读风格上力求精简,但有时性能和风格并不调和,因此,有些代码会很奇异,甚至个别代码会有些嗨涩难懂(相对初学者来说),把这些悬念留给亲爱的老师来解释吧,以使课堂教学更加精彩。也把这些代码留给大伙儿一起品味吧,那是共享精华的地方。然而,终究还有不足之处,希望与读者们一起来共同提高了。8.丰富的配套资源第一版的《C++程序设计实验指导》不日也将推出第二版,其内容也将大幅度调整,它更新了C++的实验环境,同时也大幅度提高了编程指导的深度和广度,《C++程序设计习题及解答》也将大幅度充实和调整。作者还将陆续撰写《C++程序设计教程详解》和《C+t程序设计教程精粹》,以飨读者。此外,电子课件,书中的源代码都在清华大学出版社http://www.tup.com.cn中提供下载。编排特点△每章首均以精炼的文字描述本章所要讲述的内容以及意义。每章结束时亦以生动的文字,给出本章内容的概括性描述,指出本章在全书中的重要程度,并且指导学生进一步学习。www.TopSage.com
www.TopSage.com

V第二版前言△:章节自都附有英文,它们涵盖了C++大部分的术语,加上书中凡是新出现的概念都用英文标出,这样便可以强化今后对C++原版书的阅读理解能力。A每章末的习题都是操作性习题,能通过上机加以验证。△每个有编号的程序代码都经作者亲手在BorlandC++Builder6.0的环境上调试完成,都是完整的可运行程序,它的结构是以程序名引导,点出程序功能,然后以各个代码块列出。代码块之间的注释行,起到分隔代码模块,强化阅读理解的作用。代码中的C++关键字用黑体标出,预编译指令用斜体标出,一目了然,如临编程开发的代码编辑现场。每个程序一般都有运行结果,如果是描述同一功能的程序,已经在前面列出了运行结果,则本程序运行结果免去。运行的结果用框圈出,框中的内容中,由键盘输入的字符用下划线标示,/为回车符。△有些程序的运行需要文件数据,则含有数据内容的文件框列在程序代码的右上方。一些习题也以数据文件框和运行结果文本框作为编程的输入输出要求。△程序设计课程与计算机的其他课程有许多内在的联系,书中将以指引参考文献的方式引导读者进一步阅读。同样,涉及一些高级C++技术的时候,也以参考文献的方式指引读者阅读经典读物。例如,(参考文献[1JCH2.5)表示书后列出的参考文献[1]中,第2章第5节。书中内容自成体系,各章各节互相参照,若超前引用后面叙述的知识,则以后面的章节目号指引读者参考某个细节。例如,名空间域(CH7.6),表示第7章第6节以整节的篇幅详细地描述了本概念。△:附录中附有语法导读和标准库导用,它们是编程学习中的重要参考。此外,还附有参考文献,它们是读者学习的好帮手。温馨致谢全国各地的读者甚至海外华人对本书第一版给予了高度评价,他们的支持、鼓励和催促,是我撰写第二版的强大动力。同时他们还提出了许多宝贵意见和建议。无疑,他们推进了第二版的撰写质量,并影响了书稿风格。他们所提的问题,许多都成了书中细节描写的靓点。浙江工业大学的教学大课堂给我提供了教学实践的场所。学生们虚心求教的态度感动了我,使我下决心一定要搞清原来还不十分清楚的概念,也一定要调通那些稀奇古怪的源代码。他们追问我的问题,带给我长久的思考,于是,书稿轮廓也就慢慢地清晰起来了。ACM/ICPC(国际大学生程序设计竞赛)培训是我的另一项积累教学经验和获得教学资料的工作。学生们学了一年的编程课程,转到竞赛培训中来,似乎仍是从零开始。它让我确信,实践环节对初学者来说,是多么重要,也就更坚定了我强调实践的宗旨。①MicrosoftVisualC++6.0因其较多的非标准性而妨碍了标准编程实践,尤其是它不甚支持诸多的标准类编程,所以没有被作者采纳。读者也可以使用MicrosofVisuaiC++NET版本,或者Linux下的G++3.0以上版本来验证书中程序。www.TopSage.com
www.TopSage.com

大网VI第二版前言一些学生得知我在撰写书稿,主动要求“先赌为快”,他们阅读了部分书稿,并提出M了修改意见,使我少走了许多弯路。许多同事关心此书的早日付印,给了我春天般的温暖。他们温馨地提醒我不要浪费宝贵的光阴。出版社也经常关心我的编写进度,令我无以逃避,只能坐下来,静心写作和调试代码。C++的泰斗BjarneStroustrup虽未晤面,但其经典之作C++ProgrammingLanguage始终在我脑中素绕,给了我摧破任何技术障碍的力量。我感到欣慰,因为我能为国家,为读者做出一点贡献,也因此感谢所有赋予我灵感和力量的人们,我更以无限之情,感激终于成就此书的天时、地利、人和。路漫漫,我当继续努力,不负众望。作者的电子邮件地址是:qianneng@mail.hz.zj.cn钱能2005年夏于杭州自在居www.TopSage.com
www.TopSage.com

目录(Contents)第一部分基础编程(PartITheBasicProgramming)第1章概述(Introduction).1.1程序设计语言(ProgrammingLanguage)1.2C++前史(TheOriginsandHistoryofC++)1.3C++.-1.3.1衰贬C(CommentonC)1.3.2C继承者(InheritorofC)T1.3.3标准C++(StandardC++)81.4C++编程流程(C++ProgrammingFlow)81.4.1编程过程(ProgrammingProcedure)1.4.2最小样板程序(MinimumSampleProgram)101.4.3编程风格(ProgrammingStyle)111.5程序与算法(Programs&Algorithms)111.5.1程序(Programs)111.5.2算法(Algorithms)121.5.3编程与结构(Programming&Structures)131.6过程化程序设计(ProceduralProgramming)131.6.1基于过程的程序设计(Procedure-BasedProgramming)161.6.2结构化程序设计(StructuredProgramming)171.7对象化程序设计(ObjectifiedProgramming)171.7.1基于对象的程序设计(Object-BasedProgramming)201.7.2面向对象的程序设计(Object-OrientedProgramming)·211.8目的归纳(Conclusion)231.9练习1(Exercises1)24第2章基本编程语句(BasicProgrammingStatements)242.1说明语句(DeclarativeStatements)252.1.1变量定义(VariableDefinition).262.1.2函数声明和定义(FunctionDeclaration&Definition)272.1.3初始化与赋值(Initializing&Assignment)272.2条件语句(ConditionalStatements)272.2.1if语句(ifStatement).302.2.2条件表达式(ConditionalExpressions)www.TopSage.com
www.TopSage.com

目录(Contents)VII312.2.3switch语句(switchStatement)-342.2.4if或switch语句(iforswitch)342.3循环语句(LoopStatements):342.3.1for循环结构(forLoopStructure)·362.3.2for循环(forLoop)372.3.3while循环(whileLoop)392.3.4do-while循环(do-whileLoop)402.4循环设计(LoopDesigns)402.4.1字符图形(CharacterGraphics)442.4.2素数判定(PrimeDecision)452.5输入输出语句(I/OStatements)452.5.1标准I/O流(StandardI/OStreams)462.5.2流状态(StreamStates)482.5.3文件流(FileStreams)512.6转移语句(MoveStatements)512.6.1break语句(breakStatement)512.6.2continue语句(continue Statement)·532.6.3goto语句(gotoStatement)552.7再做循环设计(MoreLoopDesigns)552.7.1逻辑判断(LogicDecision)572.7.2级数逼近(ProgressionApproximation)602.8目的归纳(Conclusion)2.9练习2(Exercises2)61** 64第3章数据类型(DataTypes)· 653.1整型(intTypes)653.1.1二进制补码(BinaryComplement)· 673.1.2整型数表示范围(intRange)·683.1.3编译器与整型长度(Compiler&intLength)· 683.1.4整数字面值(IntegerLiterals)693.1.5整数算术运算(IntegerArithmeticOperations)*703.2整数子类(intSubtypes)·703.2.1字符型(charType)713.2.2枚举型(enumType). 723.2.3布尔型(boolType)·723.3浮点型(floatType)..723.3.1浮点数表示(Floating-PointNumberRepresentation).763.3.2浮点型表示范围(Floating-PointTypeRanges)·773.4C-串与string(C-strings&string)www.TopSage.com
www.TopSage.com

目录(Contents)IX3.4.1C-串(C-strings)77.77om3.4.2字符指针与字符数组(charPointers&charArrays).803.4.3string:.813.4.4string与C-串的输入输出(string&C-stringI/O)-823.4.5string流(stringStreams)83数组(Arrays)3.5833.5.1元素个数(NumberofElements)843.5.2初始化(Initialization)85默认值(DefaultValues)3.5.3..86二维数组(2-DArrays)3.5.4873.6向量(Vectors)873.6.1基本操作(BasicOperations)-88添加元素(AddingElements)3.6.2893.6.3二维向量(2-DVectors)913.7指针与引用(Pointers&References).913.7.1指针(Pointers)933.7.2指针的类型(PointerTypes)953.7.3指针运算(PointerOperations)973.7.4指针限定(PointerRestrictions)983.7.5引用(References)1003.8目的归纳(Conclusion)1003.9练习3(Exercises3)103第4章计算表达(ComputationExpressing)1034.1名词解释与操作符(NameExplanation&Operators)1034.1.1名词解释(SomeNameExplanations)1054.1.2操作符汇总(OperatorsSummary)1054.1.3操作符的说明(OperatorExpanations)1064.2算术运算问题(ArithmeticProblems)1064.2.1周而复始的整数(int:MoveinCycles)·1074.2.2算法局限性(AlgorithmLimitation)1084.2.3中间结果溢出(IntermediateResultOverflow)-1094.2.4浮点数的比较(Floating-PointNumberComparison)..1114.3相容类型的转换(CastCompatibleTypes).-1114.3.1隐式转换(ImplicitCast)1124.3.2精度丢失(LostPrecision)1134.3.3显式转换(ExplicitCast)4.4关系与逻辑操作(Relations&LogicOperations)114·1154.4.1条件表达(ConditionExpressing)www.TopSage.com
www.TopSage.com