图书前言

一、 本书的写作背景

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月于北京大学