
| 前言 近年来,支持面向对象程序设计的C++语言迅速地在国内推广,不少高校开设了C++课程,由于C++牵涉概念很多,语法比较复杂,内容十分广泛,不少人感到学习难度较大,难以入门。许多热情的读者多次向我提出,希望我能在《C程序设计》的基础上,再写一本易于入门的《C++程序设计》,以帮助更多的初学者更顺利地迈进C++的大门。 从2002年起,我花了两年时间,完成了《C++程序设计》一书,由清华大学出版社出版。该书出版后受到广大初学者的欢迎,认为定位准确,取舍合理,概念清晰,逻辑严密,通俗易懂,容易入门。很多教师反映用它作为教材,易教易学,效果很好。很多学生反映,即使没有老师讲授,也能基本看懂该书的内容。该书出版后在一年左右时间内重印了7次,发行6万多册,许多高校选用为教材。 当初在编写《C++程序设计》时,考虑到有些学校并不是把C和C++分别作为独立的两门课,而是希望在C++课程中包括C语言程序设计的基本内容。因此该书的定位是为没有学过C语言的读者写的,不要求学生在学该书之前具有程序设计的基础。在教材内容安排上,先介绍面向过程程序设计,然后再介绍面向对象程序设计。这样的安排,对于未学过面向过程程序设计的学生来说,是比较合适的。 目前在大学生中,也有不少人是学过面向过程的C语言程序设计的,许多学校的师生希望我能在该书的基础上出版一本以C语言为起点的C++教材,这样可以节省教学时间,更好地满足广大师生的要求。本书就是在这种情况下问世的。 本书是在《C++程序设计》一书的基础上改写而成的。考虑到本书的读者已学习过C语言程序设计,因此不必再重新学习面向过程程序设计的部分,而直接从面向对象程序设计入手,将《C++程序设计》一书中介绍面向对象程序设计的第8章到第14章抽出来改写后单独成书,并且重新写了第1章,介绍C++面向对象程序设计的初步知识以及C++对C在面向过程程序设计方面的改进与增强,为以后各章的学习打下基础。 这样的安排使本书内容更集中,篇幅更紧凑。本书仍然保持了通俗易懂、贴近读者、容易入门的特点。希望有助于大学生学习C++课程,初步掌握面向对象程序设计的方法。 作者认为: 要写好和教好C++程序设计,决不是一个纯技术问题,需要综合考虑多方面因素,作出合理的决策和安排。我调查了我国大学的程序设计课程的现状和发展趋势,了解了国内外C++的教学和使用情况,认真分析了学习者在学习过程中遇到的困难,研究了初学者的认识规律,并且参阅了国内外数十种C++的教材,形成了以下几点看法,并体现在本教材中。 1. 教材必须准确定位,合理取舍内容 写书首先要弄清楚本书是为什么人写的,他们学习C++的目的是什么,应当学到什么程度。应当声明: 本书的对象不是C++的专业开发人员,而是高校各专业的大学生,他们并无从事程序设计的实际经验,将来也不一定是C++的专业开发人员。众所周知,研制C++的初衷是为了解决大型软件开发中遇到的问题,提高软件的开发效率。只有参加过研制大型软件的人才会真正体会到C++的优越性,并善于利用C++的独特机制去进行软件开发。 C++面向对象程序设计前言大学生在学校学习期间学习C++的目的是了解面向对象程序设计方法,能够利用C++编写相对简单的程序,为以后进一步学习和应用打下良好的基础。不可能设想,通过几十小时的学习,就能使一个没有程序设计基础的初学者变成一个熟练的C++开发人员。应当有一个实事求是的分析和估计。因此,本书着力于使读者对C++的全貌和作用有基本的认识,用容易理解的方法讲清楚有关的基本概念和基本方法,而不去罗列C++语法中各种烦琐的细节;否则将会使篇幅过大(许多国外的书厚达近千页),而且会冲淡重点,主次不分,使读者感到枯燥无味。 不应当把教材写成手册,教材的任务是用读者容易理解的方法讲清基本的概念和方法,而手册的任务则是给出一个包罗万象的备查资料。读者在掌握基本的概念和方法的基础上,在从事实际程序开发时遇到具体问题时,查阅一下手册即可。 2. 设计合适的教材体系 C++程序设计牵涉面向对象程序设计的理论、C++语言的语法以及算法3个方面的内容,其中每一方面都包含十分丰富的内容,都可以分别单独成书。显然在一本教材中深入、详细地介绍以上3个方面的知识是不可能的,必须把它们有机地结合起来,综合应用。不同的书对此采取不同的写法,侧重点有所不同,各有道理,也各有优缺点,适合于不同的读者,需要在教学实践中检验,取长补短,不断完善。 作者认为: 要进行C++程序设计当然需要了解面向对象程序设计的有关概念,但是本课程毕竟不是一门面向对象程序设计的理论课程,在本书中不是抽象地介绍面向对象程序设计的理论,而是在介绍C++语言的特点和应用过程中自然地引出面向对象程序设计的有关概念,通过C++的编程过程理解面向对象程序设计方法。在各章中结合例题介绍有关的算法,引导读者思考怎样构造一个算法。编写程序的过程就是设计算法的过程。 要用C++编程序,最基本的要求是正确掌握和运用C++。由于C++语法复杂,内容又多,如果对它缺乏系统了解,将难以真正应用,编出来的程序将会错误百出,通不过编译,事倍功半。本书的做法是全面而系统地介绍C++的主要特点和功能,引导读者由简到繁地学会编写C++程序。有了C++编程的初步基础后,再进一步提高,掌握更多更深入的算法。这样的方法可能符合大多数学习者的情况,降低了学习难度。 3. C++教材应当体现C++标准 C++是从C语言发展而来的,为了与C兼容,C++保留了C的许多用法,人们在编写C++程序时也常常沿用C的某些传统用法。例如主函数为void类型,无返回值;头文件带后缀.h;使用系统库时不使用命名空间等。但是,ANSI C++标准在一些方面有新的规定,例如要求主函数为int类型,如果程序正常执行则返回0值;系统头文件不带后缀.h;使用系统库时使用命名空间std;增加了字符串类型string等。 虽然C++仍然允许使用从C继承来的传统用法,但作者认为: 作为教材,应提倡C++的新方法。应当引导读者从一开始就按照C++标准编写程序,养成C++的编程风格。本书各章都是依据C++标准介绍的,同时也说明允许使用的C的用法。在本书中,程序的形式大致如下:#include #include using namespace std; //使用系统库时使用命名空间std int main() //主函数为int类型 {? string str; //可以定义字符串变量str ? return 0; //程序正常执行则返回0 }4. 引导学生学习标准C++,而不是又学习依赖于某一特定环境下的“方言化”的C++ 本书介绍的是标准C++,读者在学习过程中可以在不同的环境下运行自己的C++程序,但它们只是被当作编译器来使用。不宜喧宾夺主,把过多的精力放在学习某一编译系统的具体细节上,学习的重点应当是C++本身。读者应当能够在不同的平台上(例如Windows环境和非Windows环境) 编译和运行C++程序。 5. 本教材力图使学习C++更容易 作者在写作过程中花了很大的精力去考虑怎样使读者易于接受和理解。作者一贯认为,教材编著者应当与读者将心比心,换位思考,要站在读者的立场上思考问题,帮助他们排除学习中的困难,要善于把复杂的问题简单化,而不应当把简单的问题复杂化,要善于化解难点,深入浅出。不要让读者被一大堆高深莫测的名词术语吓唬住,有些问题看起来很深奥,其实换一个角度去解释就很容易理解,甚至用一个通俗的例子就把问题说清楚了。本书尽量用通俗易懂的方法和语言叙述复杂的概念,力求减少初学者学习C++的困难。本书便于自学,即使没有老师讲解,读者也能看懂本书的大部分内容。这样,老师教学时就可以不必完全按照教材的内容和顺序详细讲解,而可以选择重点讲授,其余内容由学生自学。 6. 本教材中所举的程序,是从教学的角度考虑的 本书中的程序是为了帮助读者更好地理解和应用某一方面的教学内容而专门编写的,并不一定是实际应用的程序。一个实际的C++程序需要考虑许多因素,综合各部分知识,有许多注释行,而且一般是多文件的程序,篇幅较长,往往不适合作为教学程序。教学程序对问题作了简化,尽量压缩不必要的语句,减少注释行,篇幅一般不长,力求使读者能读懂程序。有些在专业人员看来很“幼稚”的程序,对学习者来说可能是一个很合适的教学程序。不要忘记,教材的任务是用读者容易理解的方法讲清基本的概念和方法。在初步掌握C++编程方法后,可以逐步使程序复杂一些,长一些,更接近真实程序一些。在学完本课程后,最好完成一个实际的应用程序,以提高实际应用的能力。 7. 教材要有完整的配套 程序设计是一门实践性很强的课程,只靠听课和看书是学不好的。衡量学习好坏的标准不是“懂不懂”,而是“会不会干”。因此必须强调多编程,多上机实践。考虑到不同学校、不同专业、不同读者对学习C++有不同的要求,因此要提供配套用书,不同的读者可以根据要求选用。 本书有两本配套的教学参考书: (1) 《C++面向对象程序设计题解与上机指导》。提供主教材各章中的全部习题的解答。由于教材的篇幅有限,有些很好的例子无法在教材中列出,我们把它们作为习题,希望读者自己完成,教师也可以从中选择一些习题作为例题讲授。学生除了完成教师指定的习题外,最好把习题解答中的程序全部看一遍,以更好地理解C++程序,扩大眼界,启迪思路,丰富知识,增长能力。在《C++面向对象程序设计题解与上机指导》中,还介绍在两种典型的环境下运行C++程序的方法,一种是Windows环境下的Visual C++ 6.0,一种是GCC。GCC是自由软件,不必购买,随该书赠送。GCC可以在Windows环境下使用,也可以在非Windows环境(如DOS,UNIX,Linux)下使用。此外,书中还给出上机实践任务,要求学生完成若干次上机实践。 随该书赠送的光盘中包括主教材中全部例题的源程序,以便于教师讲授,也便于学生在此基础上调试和修改程序,以学得更灵活深入。 (2) 《C++程序设计实践指导》。这是为学习教材后进一步深入学习的读者准备的,目的是提高编程能力。有的专业对学生使用C++编程有一定要求,可以在学完课程后,安排一段集中的时间进行一次编程实践,相当于课程设计。该书内容包括: 怎样编写C++应用程序;提供若干个不同规模的实际的C++应用程序供分析阅读;安排并指导学生完成1~2个C++应用程序。经过这样的训练,学生的实际能力将会有较大的提高。 此外,向使用本书的教师免费提供讲课的电子演示文稿(素材) ,以节省教师的备课时间。 本书由谭浩强编写,谭亦峰和薛淑斌高级工程师参加了写作思路的研讨、收集材料、调试部分程序等工作。全国高等院校计算机基础教育研究会和浩强工作室的各位专家以及全国各高校老师几年来对本书的编写始终给予了热情的支持,清华大学出版社对本书的出版十分重视并作了周到的安排,使本书得以在短时间内出版。对一切曾经鼓励、支持和帮助过我的同志和朋友,谨表示真挚的谢意。 本书肯定会有不妥甚至错误之处,诚盼专家和广大读者不吝指正。 谭浩强2006年1月1日于清华园 |
| 谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业,,学生时代曾担任清华大学学生会主席、北京市人民代表。他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校计算机基础教育研究会会长、教育部全国计算机应用技术证书考试委员会主任委员。 |
| 第1章 C++的初步知识 1.1 从C到C++ 1.2 最简单的C++程序 1.3 C++对C的扩充 1.3.1 C++的输入输出 1.3.2 用const定义常变量 1.3.3 函数原型声明 1.3.4 函数的重载 1.3.5 函数模块 1.3.6 有默认参数的函数 1.3.7 变量的引用 1.3.8 内置函数 1.3.9 作用域运算符 1.3.10 字符串变量 1.3.11 动态分配/撤销内存的运算符new和delete 1.3.12 小结 1.4 C++程序的编写和实现 1.5 关于C++上机实践 习题 第2章 类和对象 2.1 面向对象程序设计方法概述 2.1.1 什么是面向对象的程序设计 2.1.2 面向对象程序设计的特点 2.1.3 类和对象的作用 2.1.4 面向对象的软件开发 2.2 类的声明和对象的定义 2.2.1 类和对象的关系 2.2.2 声明类类型 2.2.3 定义对象的方法 2.2.4 类和结构体类型的异同 2.3 类的成员函数 2.3.1 成员函数的性质 2.3.2 在类外定义成员函数 2.3.3 inline成员函数 2.3.4 成员函数的存储方式 2.4 对象成员的引用 2.4.1 通过对象名和成员运算符访问对象中的成员 2.4.2 通过指向对象的指针访问对象中的成员 2.4.3 通过对象的引用来访问对象中的成员 2.5 类和对象的简单应用举例 2.6 类的封装性和信息隐蔽 2.6.1 公用接口与私有实现的分离 2.6.2 类声明和成员函数定义的分离 2.6.3 面向对象程序设计中的几个名词 习题 第3章 关于类和对象的进一步讨论 3.1 构造函数 3.1.1 对象的初始化 3.1.2 构造函数的作用 3.1.3 带参数的构造函数 3.1.4 用参数初始化表对数据成员初始化 3.1.5 构造函数的重载 3.1.6 使用默认参数的构造函数 3.2 析构函数 3.3 调用构造函数和析构函数的顺序 3.4 对象数组 3.5 对象指针 3.5.1 指向对象的指针 3.5.2 指向对象成员的指针 3.5.3 this指针 3.6 共用数据的保护 3.6.1 常对象 3.6.2 常对象成员 3.6.3 指向对象的常指针 3.6.4 指向常对象的指针变量 3.6.5 对象的常引用 3.6.6 const型数据的小结 3.7 对象的动态建立和释放 3.8 对象的赋值和复制 3.8.1 对象的赋值 3.8.2 对象的复制 3.9 静态成员 3.9.1 静态数据成员 3.9.2 静态成员函数 3.10 友元 3.10.1 友元函数 3.10.2 友元类 3.11 类模板 习题 第4章 运算符重载 4.1 什么是运算符重载 4.2 运算符重载的方法 4.3 重载运算符的规则 4.4 运算符重载函数作为类成员函数和友元函数 4.5 重载双目运算符 4.6 重载单目运算符 4.7 重载流插入运算符和流提取运算符 4.7.1 重载流插入运算符“[[” 4.7.2 重载流提取运算符“]]” 4.8 不同类型数据间的转换 4.8.1 标准类型数据间的转换 4.8.2 转换构造函数 4.8.3 类型转换函数 习题 第5章 继承与派生 5.1 继承与派生的概念 5.2 派生类的声明方式 5.3 派生类的构成 5.4 派生类成员的访问属性 5.4.1 公用继承 5.4.2 私有继承 5.4.3 保护成员和保护继承 5.4.4 多级派生时的访问属性 5.5 派生类的构造函数和析构函数 5.5.1 简单的派生类的构造函数 5.5.2 有子对象的派生类的构造函数 5.5.3 多层派生时的构造函数 5.5.4 派生类构造函数的特殊形式 5.5.5 派生类的析构函数 5.6 多重继承 5.6.1 声明多重继承的方法 5.6.2 多重继承派生类的构造函数 5.6.3 多重继承引起的二义性问题 5.6.4 虚基类 5.7 基类与派生类的转换 5.8 继承与组合 5.9 继承在软件开发中的重要意义 习题 第6章 多态性与虚函数 6.1 多态性的概念 6.2 一个典型的例子 6.3 虚函数 6.3.1 虚函数的作用 6.3.2 静态关联与动态关联 6.3.3 在什么情况下应当声明虚函数 6.3.4 虚析构函数 6.4 纯虚函数与抽象类 6.4.1 纯虚函数 6.4.2 抽象类 6.4.3 应用实例 习题 第7章 输入输出流 7.1 C++的输入和输出 7.1.1 输入输出的含义 7.1.2 C++的I/O对C的发展——类型安全和可扩展性 7.1.3 C++的输入输出流 7.2 标准输出流 7.2.1 cout,cerr和clog流 7.2.2 格式输出 7.2.3 用流成员函数put输出字符 7.3 标准输入流 7.3.1 cin流 7.3.2 用于字符输入的流成员函数 7.3.3 istream类的其他成员函数 7.4 文件操作与文件流 7.4.1 文件的概念 7.4.2 文件流类与文件流对象 7.4.3 文件的打开与关闭 7.4.4 对ASCII文件的操作 7.4.5 对二进制文件的操作 7.5 字符串流 习题261 第8章 C++工具 8.1 异常处理 8.1.1 异常处理的任务 8.1.2 异常处理的方法 8.1.3 在函数声明中进行异常情况指定 8.1.4 在异常处理中处理析构函数 8.2 命名空间 8.2.1 为什么需要命名空间 8.2.2 什么是命名空间 8.2.3 使用命名空间解决名字冲突 8.2.4 使用命名空间成员的方法 8.2.5 无名的命名空间 8.2.6 标准命名空间std 8.3 使用早期的函数库 习题 附录A 常用字符与ASCII代码对照表 附录B 运算符与结合性 参考文献 |
商品评论(0条)