前 言
本书适合C++程序设计和计算机科学入门课程使用。阅读本书之前,不要求读者有任何编程经验,同时也不需要掌握高中代数之外的其他任何数学知识。
本书前几版的读者,只需仔细阅读以下解释第6版修订内容的小节,其他内容完全可以跳过不看。但本书的新读者,务必仔细阅读前言的所有内容,了解本书的概貌。
第6版修订内容
第6版采用和第5版相同的编程体系,并保留了第5版的所有内容,每章都增加了编程项目,还额外增加了字符串和调试方面的材料。此外,根据授课教师的反馈,循环相关知识和数组相关知识,都移到本书的开始部分进行介绍。因此,对类的介绍稍微往后移了一下。不过,如果是用过第5版的授课教师,可以继续沿用以前的教案,无需进行任何改动。后文“重新排序1:提前学习类”将介绍如何重新调整各章顺序,以便沿用第5版的教案进行教学。
自主决定主题顺序
C++主题的大多数入门教科书都有一个非常详细的进度表,授课教师必须严格遵循。但本书不准备这样做。对于授课教师,本书能适应您的教学方式,而不是要求教师来适应这本书。可轻松地更改章节顺序,这样做并不会失去阅读本书时的连续性。前言末尾的图P.1展示了本书所有主题的一幅“依赖图”。另外,每章都包含一个“预备知识”小节,说明在学习当前章内容之前,必须先学习哪些章的内容。这样一来,授课教师就可以轻松地重新安排各个章节的授课顺序。
虽然本书使用了库,并强调了库的重要性,但不要求任何非标准的库。本书只使用几乎所有C++实现都提供了的库。
可以随意提前或推迟介绍类
本书允许灵活地讲授类。授课教师可以提前或推迟介绍类。
本书的默认安排顺序是:首先向学生介绍变量声明、表达式求值、控制结构、过程抽象、函数定义、数组和指针处理的基本概念。这样一来,学生能牢固掌握编程概念,为后期掌握面向对象编程所涉及的复杂概念奠定扎实的基础。本书第2章~第9章介绍了最基础的编程概念。在第6章,文件I/O流用于教学生如何使用类。因为I/O流不要求使用命名空间和类库,因此在前几章,我们还要介绍如何使用预定义的命名空间和几个标准库I/O类。在第10章,学生们将学习如何编写自己的类。
打算在课程前期就介绍类的授课教师,则可以重新安排各章的顺序以便适应自己的教学需求。这方面的细节将在后文“主题可以灵活排序”提供。一般而言,授课教师可在完成第6章的教学后立即介绍第10章“定义类”。
本书采用定量方式来传授类的知识。先教学生写一些非常简单的类,然后添加构造函数,再重载简单操作符,再重载I/O操作符<<和>>,依此类推。这种定量教学方式避免学生一开始就接触大量复杂的构造和概念。但是,本书的一个目标是让学生尽可能提前地编写现实的类定义,而不是强迫他们花大量时间去编写一些故意简单化的类。到第11章结束时,学生就能写出完整而实用的类,实现“类”的课程目标。
继承问题主要在第6章讲述,使学生能提前接触这一概念。但是,本书要在晚些时候才教学生写自己的派生类,因为在一门初学课程刚开始的时候,继承和派生类的重要性往往显示不出来。第15章教学生如何定义和使用派生类,其中包括使用虚函数。有的授课教师选择在第二门课中再讲述这方面的主题,另一些授课教师则可能想在第一门课中就讨论继承问题。如果愿意,有关继承的主题也可推迟介绍,因为第16章~第18章不需要用到继承。
面向学生的易用性
一本书必须按恰当的顺序来讲解恰当的主题,这是一个最起码的要求。另外,以授课教师和其他有经验的程序员的眼光来看,书中的内容必须清晰而又正确,这是另一个最起码的要求。但是,是不是符合这两项要求的书都是好书呢?答案是否定的。书中的内容必须采取初学者容易使用的一种方式来编排。在这本入门教科书中,我尽力让学生觉得清楚和友好。根据用过本书以前版本的许多学生的反馈,证明这种写作风格确实使素材更清晰,而且通常都能为学生带来乐趣。
ANSI/ISO C++标准
本书完全兼容于符合最新ANSI/ISO C++标准的编译器。
高级主题
许多“高级主题”都成为标准的CS1课程的一部分。即使它们不是课程的一部分,也最好以补充材料的形式随书提供。本书提供了大量高级主题,它们既可集成到一门课程中,也可作为自学主题。我们全面讲述了C++模板、继承(包括虚函数)、异常处理和STL(Standard Template Library,标准模板库)。
总结框
每个要点都用一个有底纹的方框来总结。这些总结框散布于每一章。
自测题
每章都在重要位置提供了大量自测题。每章末尾给出了所有自测题的完整答案。
课堂实测
世界各地数十万学生都用过本书的前5版。许多学生和他们的授课教师都提供了有益的反馈意见,让我了解哪些适用于他们,哪些则不适用。大多数意见都积极地肯定了本书,表明大多数学生和授课教师都非常喜欢这种写作风格。当然,还有一些建议要求我对本书进行修订。所有修订意见都得到了仔细的考虑。正是基于这些宝贵的意见,这一版才能够逐渐成形,最终摆上您的案头。相较于以前各版,这一版能更好地满足学生和授课教师的需要。
主题可以灵活排序
本书允许授课教师自由地重新安排教学材料。为了展示这一灵活性,我们推荐了多种方式来排列主题顺序。采用推荐的任何一种方式来阅读本书,都不失连贯性。为了确保这种连贯性,您可能需要移动小节而不是整章。但是,只有处于方便位置的大型小节才需要移动。为了帮助您根据需要来自定义一个教学/阅读顺序,图P.1展示了一幅依赖图。另外,每章都有一个“预备知识”小节,它解释了在继续本章的学习之前,事先需要阅读哪些章。
重新排序1:提前学习类
本版主体的顺序与第5版基本一样。为了有效的设计类,学生需要掌握一些基本的工具,比如控制结构和函数定义。这些基础知识在第1章~第6章介绍。在完成第6章的学习后,学生可以编写自己的类了。要想提前学习类的知识,可采用下面的建议调整各章的顺序。
* 基础知识:第1章、第2章、第3章、第4章、第5章和第6章。这6章全面介绍了控制结构、函数定义和基本的文件I/O。第3章额外介绍了几种控制结构,如果希望尽早学习类,可以考虑推迟学习这一章的内容。
* 类和命名空间:第10章、第11章的11.1节和11.2节、第12章。这些章节全面介绍了如何定义类、友元、重载操作符和命名空间。
* 数组、字符串和向量:第7章和第8章
* 指针和动态数组:第9章
* 类中的数组:第11章的11.3节和11.4节
* 继承:第15章
* 递归:第14章(或者把递归推迟到入门课程之后的其他课程讲解)
* 指针和链表:第13章
可能还会用到以下各章的部分内容:
* 异常处理:第16章
* 模板:第17章
* 标准模板库:第18章
重新排序2:把类的学习稍微延后一点,但仍然放在前面来进行
在第6版中,在介绍类之前,全面介绍了所有控制结构和数组的基本知识,但类的介绍仍然比前面所提到的晚,只是比本书原有的顺序略微早一些。
* 基础知识:第1章、第2章、第3章、第4章、第5章和第6章。这6章全面介绍了控制结构、函数定义和基本的文件I/O
* 数组和字符串:第7章、第8章的8.1节和8.2节
* 类和命名空间:第10章、第11章的11.1节、11.2节和第12章。这些章节全面介绍了如何定义类、友元、重载操作符和命名空间
* 指针和动态数组:第9章
* 类中的数组:第11章的11.3节和11.4节
* 继承:第15章
* 递归:第14章(或者把递归推迟到入门课程之后的其他课程讲解)
* 向量:8.3节
* 指针和链表:第13章
可能还会用到以下各章的部分内容:
* 异常处理:第16章
* 模板:第17章
* 标准模板库:第18章
支持材料
部分支持材料是本书所有用户都能使用的。另一部分只有符合条件的教师才能使用。
针对本书所有读者
本书任何读者,只要访问http://www.aw.com/codemate/,就可以直接获得本书源代码和PowerPoint演示文稿。
针对符合条件的教师
选用本书作为教材的教师,可联系培生(北京)代表处,或者致函coo@netease.com,了解详情。
* Addison-Wesley myCodemate教师访问权限
* 教师资源指南(Instructor’s Resource Guide):包括每一章的教学要点、课堂测验/答案和大量编程项目的答案
* Test Bank和Test Generator:用于生成试卷
* PowerPoint幻灯片:包括本书的程序和插图
* Lab Manual(实验手册)
依赖图
依赖图展示了各个章节可能的排序方式。连接两个框的实线表明上部的框必须先于下部的框完成。只要符合这个条件,那么采用任何阅读顺序都不会损失连贯性。如果一个框中包含小节编号,表明该框只代表那些小节,不代表全章。
图P.1 依赖图
VIII
C++面向对象程序设计
XI
前言