《重点大学计算机专业系列教材:新标准C++程序设计教程》基于新的C++标准“C++11”,从全新的思路出发,融合作者丰富的编程实践经验,深入浅出地全面介绍C++程序设计的过程,包含丰富的样例程序,强调实践性和专业性。
《重点大学计算机专业系列教材:新标准C++程序设计教程》适合作为高等院校理工类专业程序设计课程的教材、学生自学和做毕业设计的参考书,也可供IT从业人员和编程爱好者参考。
《重点大学计算机专业系列教材:新标准C++程序设计教程》面向大学计算机专业的低年级学生或非计算机专业但对编程能力要求较高的学生。内容深广却通俗易懂,入门与提高并重,覆盖了C++语言的方方面面,尤其是全面介绍了标准模板库STL的用法。 编者有十年的C++语言第一线教学经验,本书写作时,就已经将对学生困惑的解答融入其中,用精简的语言直指问题的重点、难点和本质,力图使读者能独立自学本书。 本书程序实例丰富实用,贴近编程实践,强调程序设计基本思路、面向对象基本思想和算法的培养,而不是仅仅罗列C++的语法规则。 本书书名中的“新标准”有两层含义。一是指本书所有的讲述和程序都是严格遵循C++标准的,而且介绍了一些最新C++11标准的内容。第二层含义更为重要,指的是希望读者通过对本书的学习,对C++的掌握程度能够达到更高的标准,除了深入理解面向对象的程序设计外,还能够进行泛型程序设计并熟练使用STL。
一、 本书的写作背景
C++功能强大、运用广泛,许多大学都将其作为入门的程序设计语言进行教学。笔者在北京大学信息科学技术学院讲授C++程序设计已有10年,随着时间的推移,渐觉现有的教材已经不能满足教学的需要,于是萌生了自己编写一本教材的想法。
C++有两大特点: 支持面向对象的程序设计和支持泛型程序设计。然而,国内大部分教材往往对“泛型程序设计”这部分内容基本忽略,或只是略作交待。这导致许多学过或准备学C++的学生有如下印象:C++是为了编写大型的程序而设计的,如果编写一个十几、几十行的小程序,没有必要用C++,用C语言就足够了。实际上,编写很小的程序用面向对象的程序设计方法确无必要,但不等于用C++没必要。C++中的标准模板库(STL)是泛型程序设计的最成功应用,其中包含许多常用的数据结构(如动态数组、栈等)和算法(如排序、二分查找等),STL即便应用于十几行的程序中,也能有效地提高编程效率。对熟练的C++程序员来说,编写一个十几行的程序多半不会考虑到面向对象的程序设计,但会很自然地用到STL。在笔者看来,如果计算机专业的学生学了C++却不会用STL,那么找工作面试的时候是会受影响的。C++标准委员会成员Andrew Koenig有句名言“库设计就是语言设计,语言设计就是库设计。”学了C++语言,却不会用该语言的核心库,对于计算机专业的学生来说,这样的教学很难说是成功的。
国内大多数C++教材对泛型程序设计和STL讲述甚少,国外虽有几部经典教材,全面覆盖了C++的两大特点,但是都卷帙浩繁,动辄近千页,不适合初学者。为解决这个矛盾,笔者编写了本教材,篇幅适当,全面讲述了C++面向对象的各种特性,此外还覆盖了标准模板库90%以上的内容。初学者通过本书的学习,可以比较全面地掌握C++程序设计语言的精髓。
另外,大多数C++教材依据的是1998年的C++标准(一般称为“C++98”)。而在1998年后,C++标准进行了一些修订,加入了一些新特性,2011年C++标准委员会又通过了新的C++标准“C++11”。这些变化在大多数教材中没有体现。让教材与时俱进,也是笔者编写本教材的初衷之一。
二、 本书的特点
1. 内容深广却通俗易懂,入门与提高并重
本书面向大学计算机专业的低年级学生,或非计算机专业但对编程能力要求较高的学生。本书可作为入门的程序设计语言教学之用,没学过C语言的读者可以直接学习本书。
本书内容很广,覆盖了C++语言的方方面面,全面讲述了标准模板库STL的用法,几乎可以作为C++语言的参考手册来查阅。第4篇“C++高级主题”中的内容更是大多数同等篇幅的教材所不曾涉及的。而且,由于本书的宗旨是让读者不但要知其然,还要知其所以然,因此对于C++的一些语法特性,不但介绍如何使用,还会讲解C++为什么会有这个语法特性,甚至该特性是如何实现的,如“多态”的实现方法。
笔者有10年的C++语言第一线教学经验,非常清楚学生在学习C++时哪些地方不易掌握,会提出什么样的问题,以及他们的问题应该如何回答。因此,在本书写作时,就已经将学生困惑的解答融入其中,用精简的语言直指问题的重点、难点和本质,可以说将有限的文字都用在了刀刃上。笔者的目标是力图做到“读者不用教师讲授,也能独立看懂本书”。
2. 紧扣C++标准
国内大多数C++教材依据的是1998年的C++标准“C++98”。许多教材甚至都不能完全符合“C++98”的标准,这从其声称“程序都在Visual C++ 6.0中编译通过”就可看出——Visual C++ 6.0并不是严格遵循“C++98”标准的编译器。目前,对C++标准支持最好的编译器有GNU gcc和微软的Visual C++ 10.0(包含在Visual Studio 2010中)等。本书中的所有程序除个别有特殊说明的以外,都同时在Visual C++ 10.0和Dev C++ 4.9.9.2(其内核编译器是gcc)中编译通过,并且运行结果相同,可以保证是符合C++标准的,而不是某种“C++方言”。
最新的“C++11”标准通过的时间很短,目前还没有编译器能完全支持它。因此,本书不可能完全以“C++11”作为依据。本书的主要依据依然是“C++98”,但是收录了几个“C++98”之后新引入的特性,如“long long”数据类型、无序容器(即哈希表)、智能指针shared_ptr等。本书中的头文件都是C++风格的,不像某些教材仍然使用C语言风格的头文件。另外,许多教材中的程序在用到字符串时往往使用C语言风格的字符数组,而本书则尽量使用C++风格的string对象处理字符串。
3. 程序实例丰富实用,贴近编程实践
笔者不仅具有丰富的C++教学经验,还有着数十万行的C++商业软件开发经验。笔者独立开发了多种流行的英语学习软件,如《我爱背单词》、《我爱背句子》、《我爱学语法》、《我爱学音标》、《角斗士超级复读机》等,还开发了背单词的网站“爱单词网”。这些软件大量使用C++语言进行开发,有的完全用C++写成。因此,笔者自认为在对C++语言的运用和理解方面,比一般的教材作者多了一些心得,更能从实践的角度阐述如何运用C++的各种特性。本书中所有样例程序都由笔者精心编写,绝非网上复制所得。程序风格优美,贴近现实,对实践的指导意义很强。
4. 强调程序设计基本思想的培养
笔者担任北京大学ACM国际大学生程序设计竞赛队教练已有8年,手下的队员都是北京大学最出色的编程高手。他们的成长、求学、求职经历可以验证,算法才是程序设计的核心。学习程序设计决不是仅仅掌握一门语言的语法,更重要的是掌握算法。只掌握语言的语法,在碰到具体问题时往往还是不知道如何去编程解决。作为入门的程序设计语言教材,本书不可能讲述太多的算法,但是程序设计的基本思想是必定要涉及的。为此,本书专门辟出一章,讲述了枚举、递归、二分3种基本的程序设计思想。此外,其他章节的一些例题和程序也能体现程序设计的基本思路。
三、 内容编排
本书主要分为以下四篇。
第1篇结构化程序设计: 是对C语言的继承以及在C语言基础上的一些扩充。学过C语言的读者可以粗略阅读甚至跳过此篇大部分内容,但是需要学习目录中带“*”的章节,这些章节仍然是C语言中没有的内容。
第2篇面向对象的程序设计: 包含类和对象、运算符重载、继承、多态等内容,是C++语言的学习重点。
第3篇泛型程序设计: 包括如何编写模板,以及如何使用标准模板库STL。即便不想用面向对象的程序设计方法编程,学习STL也是大有裨益的。
第4篇C++高级主题: 涉及了异常处理、名字空间、C++风格的强制类型转换等C++语言中比较深入的内容,以及C++11标准引入的几个新特性。
本书各章最后都有小结和习题。各章内的讲述中还穿插了许多思考题,思考题难度较大,很适合作为启发式教学的讨论话题。
四、 总结
总而言之,本书书名中的“新标准”有两层含义: 第一层含义是指本书所有的讲述和程序都是严格遵循 C++标准的,而且提及了一些新C++标准的内容; 第二层含义更为重要,指的是希望读者通过本书的学习,对C++的掌握程度能够达到更高的标准,除了深入理解面向对象的程序设计外,还能够进行泛型程序设计并熟练使用STL。
本书的配套课件和书中的例题程序代码可以从清华大学出版社网站(www.tup.com.cn)下载。如果在本书和课件的下载使用中遇到问题,请联系fuhy@tup.tsinghua.edu.cn。
五、 鸣谢
编写本书的动力来自作者在北京大学信息学院“程序设计实习”课程的教学经历。感谢课程主持人李文新教授对作者在教学中的支持和指导。还要感谢多年来共同讲授此课程的余华山老师、田永鸿老师,和他们的讨论使我获益良多。三位老师编写的讲义,也是本书的重要参考。
感谢您选用本书。由于笔者水平所限,不足之处在所难免,欢迎读者及同仁们批评指正,笔者不胜感激。
郭炜2012年6月于北京大学
郭炜,北京大学信息科学技术学院教师,北京大学ACM国际大学生程序设计竞赛队教练。不仅具有十年的C++教学经验,还有着数十万行的C++商业软件开发经验,独立开发了多种流行的英语学习软件(如我爱背单词、我爱学语法、我爱学音标),创立了背单词的网站——爱单词网。精研算法,曾6次负责为ACM国际大学生程序设计竞赛亚洲区预选赛命题,是国内为此项赛事主持命题次数最多的人。
第1篇 结构化程序设计
第1章 计算机基础知识
1.1 信息在计算机中的表示和存储
1.1.1 如何用0和1表示各种信息
1.1.2 二进制和十六进制
1.1.3 整数和小数的计算机表示
1.2 计算机程序设计语言
1.2.1 机器语言
1.2.2 汇编语言
1.2.3 高级语言
1.3 C++语言的历史
1.4 小结
习题
第2章 C++语言的基本要素
2.1 C++的标识符
2.2 C++的关键字
2.3 最简单的C++程序
2.4 变量
2.4.1 变量的定义
2.4.2 变量的初始化
2.4.3 变量的赋值
2.4.4 常变量
2.5 C++的数据类型
2.5.1 C++基本数据类型
2.5.2 数据类型自动转换
2.5.3 用cin读人类型不同的变量
2.6 常量
2.6.1 整型常量
2.6.2 实数型常量
2.6.3 布尔型常量
2.6.4 字符型常量
2.6.5 字符串常量
2.6.6 符号常量
2.7 运算符和表达式
2.7.1 算术运算符
2.7.2 赋值运算符
2.7.3 关系运算符
2.7.4 逻辑运算符和逻辑表达式
2.7.5 位运算符
2.7.6 条件运算符
2.7.7 sizeof运算符
2.7.8 强制类型转换运算符
2.7.9 逗号运算符
2.7.10 运算符的优先级和结合性
2.8 注释
2.9 小结
习题
第3章 C++语言的控制结构
3.1 用if语句实现选择结构
3.2 用switch语句实现选择结构
3.3 用for语句实现循环结构
3.4 用while语句实现循环结构
3.5 用dowhile语句实现循环结构
3.6 用break语句跳出循环
3.7 continue语句
3.8 goto语句
3.9 使用freopen方便程序调试
3.10 小结
习题
第4章 函数
4.1 函数的定义和调用
4.1.1 函数的定义
……
第2篇 面向对象的程序设计
第3篇 泛型程序设计
第4篇 C++高级主题