C++ 书籍导读 - 引言
一直承诺为这个版的 C++初学者以及其他感兴趣的读者写这篇东西,深感困难。一方面,我不可能通读所有的著作;另一方面,去评价诸位大师的著作总是心感不安。好在可以换一个角度,从一个学习者、消费者的需要出发,来看看选择书籍过程中所需要考虑的问题。
很多的作者和大部分出版商都会声称自己的书适合你,甚至适合从初学者到高级读者的所有人群,尽管理由可以头头是道,遗憾的是这是不可能的。不过本文的观点也只代表一家之言,任何事情都不能绝对化,因此仅仅作为参考。
要想选择一本适合自己读的书,第一步最好是要对你自己的情况以及 C++本身有所了解。这听上去好像是要取锁在屋里的钥匙。不过,如果你不认识钥匙是什么样子的,即使你进了屋子也白搭。
学前动员
在动员之前,我还是想泼一下冷水。C++ 可是目前大多数通用编程语言中最难学的一个。如果应付一时只需或希望有很快的上手,Visual Basic、Java可能会是更好的选择。掌握他们也很可以在公司找到差使,甚至如果你看些资料,满口英文,还可以混到一个不错的职位。
至于 C++和其他语言的比较,我们准备另出 FAQ。我只想说的是,C++ 像一个健壮和智慧的男子,学习和掌握他,你可以像他一样健壮和智慧。
学前准备
初学者的情况会比较复杂,知识掌握的程度参差不齐。我认为在学习一门计算机语言之前,特别是你如果要学习 C++的话,应当对计算机的基础知识有所了解,包括 CPU、指令系统、存储器、虚拟存储器、二进制与十六进制数字、操作系统等。这些知识也可以随 C++的学习而渐进,但是不掌握这些知识对运用 C++会有很大的障碍。特别是那些没有接触过编程的人,要特别注意这一点。
另外,应该清楚编一个完整的程序实际上要和四个东西打交道: 1、语言本身; 2、语言的开发工具; 3、操作系统的应用程序接口(API); 4、应用领域的应用程序接口。例如,编写一个收取邮件的程序,我们可以完整地描述为:
我“用 C++ 语言”“使用 Microsoft Visual C++ 7.0开发工具”“在 Microsoft Win32平台(NT/2000/xp)上”“使用Winsock API” 开发一个邮件收取程序。
C++ 是一个编译语言,就是说,书写的 C++源程序,需要经过编译器等工具进行编译、连接,变成操作系统能够使用的可执行文件,程序才能运行。常见的编译器包括Windows 下常用的 Microsoft C++,以及 Unix/Linux 下常用的g++;源程序编辑器、编译器、连接调试工具经常组合在一起形成一个产品,提供更方便的开发环境(IDE),例如 Microsoft Visual C++ 和 Dev C++等。
学习 C++还需要了解常用数据结构的概念,包括向量、队列、表、树,以及时间复杂度、空间复杂度等,因为C++ 的标准库就会经常和这些东西打交道。
C++ 从发明至今已经有十几年的历史,可以说历史上大约有两次 C++的市场高峰,一个是 C++面世不久,Microsoft/Borland 推出了自己的 C++产品,特别是大家熟知的TC/BC++ 3.x;另一个高峰就是 1998年 C++的ANSI标准通过后直到今天,C++ 的应用得到空前的推广和普及。我要学习的现代 C++就是指符合ANSI标准的 C++,而不是早期的 C++。
学习步骤
学习C++ 本身大致分为 5 个步骤:
不管 C 语言的 C90 版本如何,我们仍然可以说,C++ 的单句语法是基本继承了 C 的单句语法。学习 C++ 的第一步是掌握单句语法,包括变量、表达式、条件转移、循环语句、指针等;
第二步是学习 C++的面向对象的抽象机制,包括类、类的派生和继承、多态等。早期的 C++ 大致就是这些了;
第三步是学习 C++的泛型编程的抽象机制,包括类和函数的模板。这个是早期 C++所不具有或不完备的;
第四步是学习 C++标准模板库(STL) 的使用。把库提高到语言的高度,说明了STL 的重要程度。这个是前人经验的总结,熟练使用 STL,实际上能够把编程
的效率提高一个档次;
第五步可以穿插在上述四个步骤中,就是学习和掌握 C++的高级特性,包括异常、运行时刻类型机制、操作系统API的使用、线程和进程以及其他使用技巧。
学习过程
初学者本身的情况实际上就是学习的起点;
还应该为自己设立一个目标,至少是一个里程碑,是希望对 C++有所了解呢,还是希望成为一个 C++高手;以及希望在哪些方面有所特长?
有了起点和目标,决定学习时间长短的就是你的能力和付出的努力了。大致的说,学过其他编程语言的,粗粗学完第二步大约只需要1-2个月,即可上手甚
至编写一些复杂的东西,而比较精细和完整地掌握大部分东西,可能需要至少一年时间甚至更长。
弹性之大完全是因为每个人的学习情况完全不同,格外的努力和聪明、格外的懒散和笨拙,对学习时间都和结果都影响很大。
书籍介绍
随后的书籍介绍大致会按照:书籍本身介绍的摘录、大致评价、适用者以及比较、采购等几个方面来进行。新书会层出不穷,本系列也随之更新。
书的内容是否反映C++全貌
-----------------------
我们这里讲的书都是指那些系统的教材,因此,反映C++ 的全貌是很重要的。
我们常见的 C++ 教材从内容上,可能包括下面的部分:
1、计算机与二进制基础知识;
2、C++ 基础语法;
3、C++ 面相对象抽象机制; (OO - Object Oriented)
4、C++ 模板、泛型编程抽象机制; (GP - General Programming)
5、C++ 标准模板库与数据结构/算法;(STL - Standard Template Library)
6、C++ 编程思想、编译问题与高级技巧;
例如 C++ 发明人 Bjarne Stroustrup 的 The C++ Programming Language 就是包括 2-6,并以3-5 为主要内容,并综合介绍编程思想以及 C++各项功能的原理的。
这个原则可以帮助我们筛选掉一些不合格的、内容比较过时的书。很多国内作者的书可能只包括1-3,或者4-5只占1、2章这样极少的篇幅,这样的书就属于内容不全,可能造成重复购买。
书的内容是否详略得当
--------------------
由于现代 C++的内容非常厚实,一般的 C++教科书的厚度都在3-4 厘米,五号字排版,需要800-1200页。
教材应该以教授目的为主,过于简略(大部分国内教材),失去细节,可能造成学习者不能实际掌握;过于详细,会增加学习者的负担,在细节上耗费功夫。后面我们会比较,例如 Deitel 父子一共出了很多本 C++的书,其中最厚的那本就是细节过多,不适合于初学者阅读,而适合于中级读者再学习或参考使用。
如果有一定基础,可以看看书的目录,看看书的各部分章节的配重。有些书章节很全,但是 模板/STL 部分的比重很少,这样的书可能重点在前面,即类的使用那部分。例如电子工业出版社的《C++语言程序设计》 ( James P.Cohoon, Jack W.Davison: C++ Program Design (3rdEd) 就是这样一本书, 而且这本书比较详细地介绍了计算机知识和二进制的知识,因此属于入门书籍。
再例如,大家熟悉的 C++ Primer (Stanley B.Lippman, Josee Lajioe: C++ Primer (3rdEd))是以上面 2-5 的内容为主的书,各部分篇幅相当,算是一本中等难度的可以做参考书的一本教科书。
看编排的结构
------------
大部分 C++的书是按照前文所述的学习步骤和内容顺序进行安排的。凡是有所不同的地方,都会构成各自不同的特色。
细心的人应该注意到,在 Bjarne Stroustrup 关于学习 C++ 就像学习一门全新语言,不需要 C 的基础的影响下,大多数现代 C++ 的书都是按照这个精神进行编排的,并且不止一本书号称“在第一章就介绍面向对象编程”、“尽量将类的介绍放到更前面的章节”。
应该说这种尝试被证明是有益的,特别是尽早介绍 C++ 程序框架, 有利于摆脱 C的固有的习惯。这种精神也是国内著者所缺乏的,他们经常是固守教授语法的做法,按照更加传统的顺序而忽略了 C++不同部分之间的联系。
在主要的基本著作中,Bjarne Stroustrup 把面向对象编程和泛型编程组合成了一个部分,类和模板分别介绍,突出的是如何进行抽象,是编程的思想;而在 Lippman 的 C++ Primer 中,是以基于对象、面对对象编程为主线,模板揉到里面去了,更加注重面向对象这个体系。这种划分没有好坏之分,只是侧重有所不同。
看程序样例的类型
----------------
不同的教材都会采用程序样例,但是方法有所不同。
大学教材采用连续样例的情况比较多,就是说,在下一章会提到上一章的例子,并进行修改和发展。有些书的例子会持续好几章,乃至全书。这种书比较适合系统阅读、连贯学习。在跳跃学习的时候就会有困难,因为经常为简单的例子要查询前面的好几个章节。《C++语言程序设计》 ( James P.Cohoon, Jack W.Davison: C++ Program Design (3rdEd) 就是这样的例子。
而 BS 的 The C++ Programming Language 就是采用的每章独立、乃至每样例独立的小例子,更适合跳跃地阅读、参考,以及不同语法或用法之间的比较。
大学教程的例子一般还会更多地采用一些数据结构和算法的例子,这样做的缺点是在阅读例子理解语法现象的同时,还必须读懂数据结构与程序的含义;优点是锻炼程序阅读能力,并同时增长数据结构方面的知识,之后再学习 STL就会有一定的基础。而且降低阅读速度,加强每个例子的理解对提高扎实的程度有益处。
而普适性的一般读物,如 Lippman 的 C++ Primer就会偏向使用更简单的例子。读者应该在其中的优劣中进行权衡。
看原著还是译著
--------------
我们随后将逐一进行介绍的书籍,翻译的质量都是上乘的。但这不排除每本书在某些地方还可以进行推敲。为了这个,我到书店专门阅读了《C++编程思想》第一版、第二板的译著,我认为这本书译著翻译质量差的传言是不可信的。
绝大多数国内读者阅读C++ 著作的最佳选择是阅读译著,而不是原著。有很多人宣称原著可以更清晰和精确地理解著作的含义,这个一般是要通过放慢阅读和理解的速度为代价。据我的经验,在清华大学的本科学生中,能够长时间大篇幅熟练阅读英文专业原著的是极少数,即使是那些终日与英语为友并准备考 GRE的那些人,阅读 C++教科书还是有困难的。
主张边看边提高英语能力的另当别论。除此之外,原著可以充当比较好的参考和细节的对证。
大多数书只适合一类读者
C++ 的书有很强的专业性,一般来说只适合具有某种基础的一类读者。特别是初学者和有较高基础的人,不可能同样适合阅读一本书。但是这句话也是相对的,不排除有更聪明的人以更顽强的意志和努力去阅读。一般来说,这种阅读需要自行查找更多的其他 C++资料,而最终的学习效果要更好。
C++ 的好书数量并不多,以适合中高级读者的 BS 的 The C++ Programming Language和适合初中级读者的 Lippman 的 C++ Primer 为代表。基本不存在只面向纯粹的初学者的 C++ 书籍。因为 C++ 就不是初级的东西。不要单纯以是否适合初学者来选择书,还要看你的目标和学习的恒心、态度。如果你没有完整系统地看过这些书,就没有必要买或者读那些“精华”、“提高”之类的东西;连走都不行呢,就学跑步的花样。该走的步子一步也省不下来。
C++ 书籍导读(4) - 选择书的基本原则
看纸书还是电子书----------------
如果你要认真学习 C++,手里有一、两本比较经典的印刷的书是很必要的。电子版本的阅读很不方便,只能做个参考。如果要通读全书,如果有人能挺着看下来,一定会影响健康。
不要哭穷。如果你想学 C++, 别说85块,就是128块钱我看再穷的学生也买得起,打工的地方有的是,少抽点烟、少喝一点啤酒、开源节流的方法很多,体面的、不体面的,脑力的、体力的都可以。我见过一个要饭的在商场门口用一个很破的音箱和卡拉OK伴奏磁带唱周华健的歌曲,一天下来可以买好几本 C++的书。
如果大学生的本事都象孔乙己,还比不上要饭的,也趁早别学 C++。嫌贵,那就勉强看英文电子版本的,效率、效果上都不可能和印刷的书相比。找电子书下载可以查 google。在本版提问不一定能得到答复。
相比起教科书来,那些以“教条”方式介绍 C++编程注意事项的高级技巧和概念解释,倒是可以以阅读电子书为主。这些东西系统性、连贯性不强,大部分不需要反复查阅,看电子书可以省一些买书的钱。
书的细部不通过细致、通篇的阅读,是很难体味得到的。因此这一点很难让没有买书的人看目录和内容简介来进行判断。我也只能通过看过的有限的基本书谈我的看法。
所谓编程思想就是讲如何进行运用。C++ 的书籍很多,但是 C++的语法确是一样的,同类型的不同的书就是编程思想的不同。
我认为能够体现编程思想的,大致有几种情况:
1、一条具体的语法如何进行运用、与C以及其他语言在用法上的区别、优缺点等。这方面比较好的书包括:《 C++编程思想》(1、2版)、《C++ 大学教程》(Deitel父子)、《C++编程金典》(Deitel父子,这本书的特点是过细,学习起来可能比较吃力)、《C++ Primer》、《C++ Primer Plus》(邮电出版社)等;
2、一类问题如何通过编程进行解决。例如 C++ 中强调的“资源获取就是初始化(resource acquisition is initialization)”就是一种主要的应用思想。Bjanre 的《C++程序设计语言》就以这种方式介绍见长。而这些思想恰恰是大多数著作所缺乏。
当然以上1、2两种也有把问题抽象出来,成为“条条”再专门举例的书,例如《Effective C++》、《More Effective C++》等,作为参考亦可一读。
3、软件工程方法。C++教科书不是软件工程方法的专著,因此,抽象谈方法的书不在此列。而与 C++ 比较联系紧密的就是最近机械工业出版社的《C++精髓——软件工程方法》(Victor Shtern),这本书在 C++ 的基础上重点谈方法,也比较系统,我认为比“条条”式的书更有价值。
显然,学习也是一个从爬到走,从走到跑的过程。循序渐进是一个无法逾越的规律,只能通过更多的努力来更快地接近目标。因此,初学者可以考虑把学习语言本身作为开始的重点,而高级的编程思想可以同时进行穿插。
初学者会面临很多实践的问题,当然教科书会提供习题,有些出版社还出了习题题解类的书。我本人对此不反对,它的确可以巩固对语法的记忆和理解,但这远远是不够的。
实践问题包括几种:
第一类:工具的使用。
怎么录入程序、怎么安装编译环境、怎样运行编译工具、怎样使用集成工具等等。这样的问题要到分门别类的书里面去找。
我在新华书店看 C++ 的书的时候,的确看到一本讲 C++ 的书(书名叫做什么xxxx典),里面介绍了怎么使用 VisualC 工具, 遗憾的是这本书本身不值得推荐,所以,名字我也想不起来了。
可以找Charles Petzold《Programming windows》以及Linux 编程方面的书,来找相关 Visual C++ 集成环境、g++ 编译工具的使用方法,也可以在 Google里面找相关的文章,或直接找到相关工具的帮助文件。
第二类:API 的使用。
有些初学者常常不能分清楚使用什么工具和手段来解决什么问题,也就导致不能自主地对问题进行分类并自行找到答案。我认为这样的问题在看过本版的几个 FAQ 之后还依然如故的话,就只能给扣上一顶不思进取的帽子了。
一个完整的综合提问大致是这样的:(当然可以不完全包括)我 (1)在什么操作系统下 (2)用什么语言 (3)用什么工具 (4)在什么领域的 (5)用什么方法 (6) 解决什么问题 (见下面的表)。
不同的问题要寻求不同的书或其他解决途径。详细的见本版《SMTH 编程讨论区提问导航》一文。
第三类:应用程序的框架设计
遇到一个问题,如何思考?如何着手解决?客观地讲,这个问题的确没有答案,尽管多读一些书,包括高级编程、软件工程等方面的各种书,尽管可以做习题,但是,大多数人的经验是逐渐积累并不断走弯路走过来的。学而不思则惘,思而不学则怠,学而时习之。我能说的,前人都说过了。
不要认为借鉴了前人,自己就不走弯路了。没有走过弯路的,永远不知道什么是弯路。所以提示初学者不要求速。经验只能用更多的付出、探索和时间去换取。
当然本版的文章,以及即将建设的精华区,以及将另出 FAQ 的全球 C++ 资源等,都是值得你博览的东西。
本文先列出一批数目,详细的介绍和评价再逐文发出来。读者可以到http://www.china-pub.com 、http://www.huachu.com.cn 等网站寻找折扣、购买方法等信息。
本文(书单(1))主要列出的是比较全面的适合做 C++ 教材的书目。其中,BS 的《C++程序设计语言》适合中高级读者;James的《C++程序设计》和Deitel父子的《C++ 大学教程》适合初、中级读者,特别是需要补充计算机和二进制基础知识的读者;其余的适合于中级读者,其中以 《C++ Primer》和《C++编程金典》在更有名气一些。他们各自的特点,见本文其他系列文章涉及到的地方。
这些书,有些属于多年流行的名著,有些广泛被美国大学所采纳。国内出版社引进的时候还是动了脑筋的。当然,书店中也有不少译著,无论在内容选材还是排版上都不足推荐为教材的,就没有列入本书单中。如有遗漏请补充。
同类书目的选择最好亲自去阅读。
尚未发现其他比较优秀的同类书目。如果有一天,有人推荐说,新出了一本C++ 教材,简直要好到天上去了,和圣经一样,你最好也别信。另外台湾作者侯俊杰翻译的《Ensential C++》和《深度探索C++对象模型》,本人没有读过,暂时无法对他们进行归类。不过从作者以及原著的影响看,不会对下面的书单造成重要遗漏。
书名:C++程序设计语言(特别版) 原 书 名:The C++ Programming Language, Special Edition 原出版社:Addison Wesley
作 者:Bjarne Stroustrup
译 者:裘宗燕
书 号:7-111-10202-9
页 码:936 定 价:¥85.00 出版 社:机械工业出版社 出版日期: 2002-7-1 ----------------------------------------------------------------------书 名:C++ Primer (3RD)中文版 原 书 名:C++ Primer Third Edition 原出版社:Addison Wesley
作 者:Stanley B.Lippman,Josee Lajoie 译 者:潘爱民张丽
书 号:7-5083-0989-8
页 码:1033
定 价:¥128.00出 版 社:中国电力出版社 出版日期: 2002-4-1 ----------------------------------------------------------------------书 名:C++程序设计 原 书 名:C++ Program Design原出版社:McGraw-Hill 作 者:James P.Cohoon & Jack W.Davidson
译 者:刘瑞挺 韩毅刚 盛素英 刘海嘉 等
书 号:7-5053-7284-X
页 码:776
定 价:¥78.00出 版 社:电子工业出版社 出版日期: 2002-1-1 ---------------------------------------------------------------------
书 名:C++ Primer Plus (第四版)中文版 原 书 名:C++ Primer Plus,Fourth Edition 原出版社:Sams
作 者:Stephen Prata
译 者:孙建春 韦强
书 号:7-115-10335-6
页 码:745
定 价:¥69.00出 版 社:人民邮电出版社 出版日期: 2002-7-1 ---------------------------------------------------------------------
书 名:C++编程思想 原 书名:Thinking in C++ 原出版社:McGraw Hill作 者:Bruce Eckel
译 者:刘宗田等 书 号:7-111-07116-6
页 码:422
定 价:¥39.00出 版 社:机械工业出版社 出版日期: 2000-1-1 现在本书第二版已出版,一本书拆成了两卷,我在书店只看到了第一卷。---------------------------------------------------------------------
书 名:C++大学教程(第二版)
原 书 名:The Complete C++ Training Course,Second Edition 原出版社:作 者:Harvey M.Deitel Paul James Deitel
译 者:邱仲潘 等
书 号:7-5053-6727-7
页 码:816
定 价:¥78.00出 版 社:电子工业出版社 出版日期: 2001-7-1 ---------------------------------------------------------------------
书 名:C++编程金典(第3版)原 书 名:C++ How To Program, Third edition 原出版社:Prentice Hall/Pearson
作 者:H.M.Deitel, P.J.Deitel
译 者:周靖 黄都培
书 号:7-302-05785-0
页 码:1036
定 价:¥118.00出 版 社:清华大学出版社 出版日期: 2002-9-1 ---------------------------------------------------------------------
除了C++ 教材之外,还有一些相关的 C++书籍,可以帮助进行提高,或在相关领域获得更多的信息。这样的书可选择的范围更宽,但是优秀的上乘之作并不多。除没有出版的外,大多我都阅读过,其余也去新华书店尽量地翻看一下,以免有重大失误。有些书可能和书名并不太符合,但是仍然有较好的参考价值。我们浏览一下那些比较典型的书目:
hhuu: lippman的 C++模型, 是一本描述C++对象模型的书, 大部分内容都很有参考价值, 而且没有同类的书可以作为比较的. 但是不适合作为教材.
相关书目的详细介绍,放到后面再写。
---------------------------------------------------------------------
书 名:C++语言的设计和演化
原 书 名:The Design and Evolution of C++
原出版社:Addison-Wesley
作 者:Bjarne Stroustrup
译 者:裘宗燕
书 号:7-111-09098-5
页 码:396
定 价:¥48.00
出 版 社:机械工业出版社
出版日期:
2002-1-1
---------------------------------------------------------------------
书 名:C++问题求解——《C++程序设计语言》的伴侣书
原 书 名:C++ Solutions: Companion to The C++ Programming Language 3/e
原出版社:Addison-Wesley
作 者:David Vandevoorde
译 者:裘宗燕
书 号:??
页 码:~300 pp
定 价:??
出 版 社:机械工业出版社
出版日期:2002-?? 尚未出版
----------------------------------------------------------------------
书 名:C++精髓——软件工程方法
原 书 名:Core C++:a software engineering approach
原出版社:Prentice Hall
作 者:Victor Shtern
译 者:李师贤 张珞玲 刘斌 译等
书 号:7-111-10100-6
页 码:804
定 价:¥85.00
出 版 社:机械工业出版社
出版日期:
2002-8-1
----------------------------------------------------------------------
书 名:数据结构算法与应用 - C++语言描述
原 书 名:Data Structures, Algorithms, and Applications in C++
原出版社:Mcgraw-Hill
作 者:Sartej Sahni
译 者:汪诗林等
书 号:7-111-07645-1
页 码:536
定 价:¥49.00
出 版 社:机械工业出版社
出版日期:
2000-1-1
----------------------------------------------------------------------
书 名:Effective C++中文版 2nd Edition
原 书 名:Effective C++ 2nd Edition
原出版社:
作 者:Scott Meyers
译 者:侯捷
书 号:7-5609-2525-1
页 码:284
定 价:¥49.80
出 版 社:华中科技大学出版社
出版日期:
2001-9-1
----------------------------------------------------------------------
书 名:More Exceptional C++中文版
原 书 名:More Exceptional C++
原出版社:Addison Wesley/Pearson
作 者:Herb Sutter
译 者:於春景
书 号:7-5609-2771-8
页 码:¥39.80
定 价:¥39.80
出 版 社:华中科技大学出版社
出版日期:
2002-9-1
----------------------------------------------------------------------
书 名:深度探索 C++ 对象模型
原 书 名:Inside The C++ Object Model
原出版社:
作 者:Stanley B.lippman
译 者:侯捷
书 号:ISBN 7560924182
页 码:320
定 价:¥54.00
出 版 社:华中科技大学出版社
出版日期:
2001-5-1
----------------------------------------------------------------------
书 名:《C++标准程序库——自修教程与参考手册》
原 书 名:
原出版社:
作 者:Nicolai M.Josuttis
译 者:侯捷 孟岩
书 号:
页 码:
定 价:¥108
出 版 社:华中科技大学出版社
出版日期:2002年9月
----------------------------------------------------------------------
书 名:C++ STL(中文版)
原 书 名:C++ Standard Template Library
原出版社:PH PTR
作 者:P.J.Plauger Alexander A.Stepanov Meng Lee David R.Musser
译 者:王昕
书 号:7-5083-1058-6
页 码:535
定 价:¥69.00
出 版 社:中国电力出版社
出版日期:
2002-5-1
----------------------------------------------------------------------
书 名:STL 源码剖析
作 者:侯捷
书 号:7-5609-2699-1
页 码:500
定 价:¥68.00
出 版 社:华中科技大学出版社
出版日期:
2002-5-1
----------------------------------------------------------------------
本来这样的介绍已经多余。为 FAQ完整起见,还是把本书列入。本文以下部分均摘录自《C++程序设计语言(特别版)》的译者序,作者裘宗燕,为北京大学数学学院信息科学系教授。
Bjaner Stroustrup的《The C++ Programming Language》是有关C++语言的第一部著作。毫无疑问,它是关于C++语言及其程序设计的最重要著作,在此领域中的地位是无可替代的。《The C++ Programming Language》一书伴随着C++语言的发展演化而不断进步,经过第1版(1985)、第2版(1991),第3版(1998),本书的原本是第3版经过补充和修订后的“特别版(2000)”(对应于国内引进的影印本)。对于这个中译本,我想说的第一句话就是“来的太晚了”。
要学习C++语言和程序设计,要将C++应用于程序设计实践,本书自然是必读之书。这个“特别版”以标准化的C++语言为基础,讨论了C++的各种语言特征和有效使用这一语言的程序设计技术。书中也用了很大篇幅,在标准库以及一般软件开发的环境下,讨论了使用C++语言编程和组织程序的许多高级技术。本书内容覆盖了C++语言及其程序设计的各个方面,其技术深度与广度是举世公认的。
然而,作者讨论的并不仅是C++语言及其程序设计。本书的讨论远远超出这一范围,第四部分用了很大篇幅去讨论软件开发过程及其问题。即使是在介绍C++语言及其程序设计的具体问题时,作者也常在程序结构、设计和软件开发的大环境下,提出自己的许多认识。作者有很强的计算机科学与技术基础,在系统软件开发方面极富经验,他所提出的观点和意见值得每个工作在这个领域中的人重视。
当然,重视并不是盲从。在Stroustrup的两本关于C++的重要著作(本书和《C++语言的设计与演化》)中,都有这样一句话使我印象深刻:希望读者带着一种健康的怀疑态度。看来这是作者深深铭刻在心的一种思想,也特别值得国内每个从事信息技术,或者努力向这个方向发展的人注意。从来就没有什么救世主,Stroustrup不是在传道,他只是在总结和论述自己在这个领域中工作的经验。请不要将本书中的东西作为教条,那也一定是本书作者所深恶痛绝
的。
许多人说本书比较难读,这种说法有一定道理。真正理解本书的一般性内容需要花一些时间,融会贯通则更需要下功夫。理解本书的内容不仅需要去读它,还需要去实践。问题是,花这个时间值吗?作者在讨论C++语言的设计时提出了一个观点:你从C++语言中的收获大致与在学习实践这个语言的过程中所付出的努力成正比;而且C++是一个可以伴随你成长的语言。同样的话也适用于本书。如果你致力于将自己发展成一个职业的程序员,或者要在计算机方面的技术领域中长期工作下去,我认为,你从本书中的收获大致也会与你所花的时间成正比,这本书也是一本能够伴随你成长的书。
当然,这本书也不是没有缺陷的。由于作者有着极其丰富的实践经验,因此,当他想要论述一个问题、提出一个观点时,常会想到在自己长期实践中最适合说明这个问题的事例,用几句简短的话引述有关的情况。由于作者对C++谙练有加,因此,在讨论中有时会不知不觉地将某些并不显然的东西当作不言自明的事情提出来。而对于许多初学者而言,这些都可能成为学习中的障碍。为了帮助这部分读者,我也在书中一些地方加入了少量注释,解释一些背景性情况。过多过滥的注释会增大书的篇幅、干扰读者阅读,绝不会是大家都喜欢的方式。因此我在这样做的时候也很有节制,希望不会引起读者的反感。
由于读者的水平有极大差异,一些人很熟的东西,另一些人可能就莫名其妙。我无法解决所有问题,但也希望能为广大读者做一点服务性的工作。为了帮助初学者入门,为使本书(包括其中文译本)能更好地在国内计算机领域中发挥作用,也为了关心本书、学习本书的人们能够有一个交流经验、传播认识的场所,我将在下面地址维护一个有关本书的信息、情况、认识和意见的网页:
http://www.math.pku.edu.cn/teachers/qiuzy/cpp.htm
在其中收集有关的信息,记录朋友们(包括我自己)的认识与意见,提出的问题和相应的认识,有关这一译本的勘误信息,原英文书的更正与更新信息等等。欢迎诸位提供自己的见解和问题,提供有价值的线索。我没时间去创建与维护一个“纯的”C++语言及其程序设计的讨论组(确实需要这样的场所,而有关VC等的讨论组倒是太多了。如果有人愿做,我乐得坐享其成、积极参与并尽可能提供帮助),只想抽空将接收到的和自己写的东西编辑公布。与我联系可以发email:qzy@math.pku.edu.cn。我还将把有关《C++语言的设计与演化》一书的相关信息也放在那里,供大家参考。
还请读者注意,本书的原本是“特别版”的第1次印刷,即“第3版”的第11次
印刷,也是目前国内可买到的影印本的原书。在那以后,作者在重印时不断更正书中的错误,并修改了少量的程序实例。最新的重印是第16次印刷,有关情况可从作者的网页或上面网址找到。由于一些情况,本书无法按最新的重印本翻译,但我还是参考了作者的网页,在译文中尽可能地采纳了有关勘误信息。此外,在翻译过程中我也发现了一些错误。经与作者的email讨论取得了一致意见,有关更正反映在本书里。由于这些原因,本书在个别地方的说法可能与读者手头的英文原书有异。如果想确认有关情况,请查看原书的勘误信息。
本来这样的介绍已经多余。为 FAQ完整起见,还是把本书列入。本文以下部分均摘录自《C++ Primer》的译者序,作者潘爱民。本人认为该书是具有计算机基础,并了解一门编程语言的人入门C++的较好的书,水平中等(译者认为是中等偏深)。
这是我心仪已久的一本书。我相信很多读者也有同样的感受。
在所有的编程语言中,C++可以说是最为复杂的。它既是一门传统的编程语言,也是一门新的编程语言。说它是一门传统语言,是因为C++诞生已将近20年的历史了,特别是最近10年来C++得到了快速的发展。C++是计算机软件领域中覆盖面最为广阔的编程语言。并且,与C++相关的智力投入也是其他任何一门语言所无法比拟的。人们对于C++的研究已经远远超出了对于一门编程语言所应有的关注。所以,现在的C++已经非常成熟,有大量的资源(文档、书籍、源代码等等)可供我们使用。说C++是一门新的编程语言,是因为在1998年C++由ISO( International Standards Organization)完成了标准化,从此C++领域有了统一的标准,所有的编译器都将向标准靠拢(或者说,与标准兼容),这有利于我们写出可移植的C++代码来。同时C++标准也统一了C++标准库,为C++用户提供了最为基本的基础设施。C++经历了多年的发展,终于有了一个相对稳定的版本,所以,我们应该用一种新的眼光来看待C++,而不再简单地把C++认为是C语言的超集。本书正是新版本C++的写照,通过本书,你可以重新审视C+十语言,这是我翻译过程中最为真切的体会,它纠正了我过去对于C++语言的一些误解。虽然我从1993年开始就一直在使用C++,但是直到阅读了这本书之后,我才从真正意义上全面地认识了C++语言。
本书的权威性无需我多说,看看本书原著的前言,了解了两位作者的背景之后,你就可以知道,这本书是经验和标准的完美结合。Stanley Lippman从1984年开始一直从事C++方面的工作,在C++的实现与应用方面有着丰富的经验。本书前两个版本的成功也证明了他在阐释 C++语言方面的独到之处。Josee Lajoie从1990年开始成为C++标准委员会的一名成员,并且承担了很重要的职务。由于她的参与,毫无疑问,本书一定是与标准兼容的。
讲述C++的书非常多,并且不乏优秀和经典之作。在如此众多的C++书籍中,本书仍具有不可替代的地位,我想主要的原因在于本书具有以下几个特色:
(l)内容广阔。从本书的规模(厚度)就可以看出这一点,C++语言融入了大量优秀的特性,其内容的丰富程度已经远非C语言所能及。在所有的C++书籍
中,本书的覆盖面是最为广阔的,从最基本的C++程序设计,到面向对象程序设计,以及基于模板的程序设计,面面俱到,而且讲解细致入微,值得仔细品味。
(2)许多实际的范例程序。纯粹的技术讲解总是非常枯燥的,但是阅读本书并不感觉枯燥,因为作者在介绍每一部分内容的时候都结合一个实际的例子,读者通过这些例子能够很容易地掌握相应的技术要点,并且看到每一种技术的实际用法,这是本书之所以引人入胜的重要原因之一。
(3)叙述内容的安排。C++是一门多风格的程序设计语言(multi-paradigm Programming language),不仅支持面向对象程序设计,也支持其他的程序设计思想。本书的叙述结构正体现了C++的这种特点,作者从程序设计思想的角度分别讲述了C++的各种语言要素,便读者比较容易抓住C++语言的本质特征。
(4)与编译器无关,遵从C++标准。本书的内容并不特定于某一个C++编译器实现,而是适用于所有与C++标准兼容的编译器。作者在讲解过程中也指出了编译器的一些内部考虑,例如,编译器如何在各种上下文环境中解析重载函数,如何处理除式类型转换,等等,这些内容有利于加深读者对C++的理解。
(5)配套的练习。在每一节讲解之后,作者给出了一些练习,这些练习反映了这一节的中心内容,读者通过这些练习可以巩固所学的知识。所以,本书也可以被用作教材,用于系统全面地学习C++语言。
虽然本书书名《C++Primer》的中文含义是"C++初级读本",但是它绝对不是一本很轻松的入门教材,特别是关于名字空间、函数重载解析过程、模板机制和泛型算法(generic algorithms)等内容并不是一个 C++初学者能够很快掌握的。如果你以前没有看过其他的C++书籍,那么可能需要反复阅读多遍才能掌握本书讲述的内容:如果你已经有了C++的基础(比如,已经看过其他的C++入门书籍),那么阅读本书可以让你快速掌握C++的要点:如果你是一名有多年C++实践经验的程序员,那么阅读本书可以让你重新理解C++。总之,这是一本很好的学习和参考书籍,值得你反复阅读。但是,正如书名所指示的,它不是一本高级书籍。按照我个人理解,它的技术水准应该在中等偏深一点的层次上。
本书的翻译工作由我和张丽共同完成,张丽完成了初稿的翻译工作,我做了第二遍翻译检查工作,书中每一句话我都认真检查过,个别地方还修改了原著的一些错误。C++中有些术语还没有统一的中文说法,对于这些术语的处理,我们尽可能地做到符合中文的语言习惯,读者可以参考本书最后所附的英汉对照索引。这份索引是由中国电力出版社的诸位编辑手工制作完成的。他们是刘江、朱恩从、陈维宁、程璐、关敏、刘君、夏平、宋宏、姚贵胜、常虹、乔晶、阎宏。感谢他(她)们的辛勤劳动。
在翻译过程中,不断收到读者来信或者来电询问这本书的出版情况。我理解读者对于一本好书的迫切心情,我的想法是,有关C++的书籍和资料如此之多,所以,学习C++不一定非要阅读这本书,但是它可以加快你学习的步伐,并且帮助你深入而全面地理解C++。既然你已经看到了这本书,那就不要错过吧。