看孟岩对C++ PRIMER第四版所写的书评

转载 2006年05月30日 13:59:00
    很多人可能还记得2002年C++ Primer第三版在国内计算机图书市场上创造的辉煌成绩,当时这本书在价格相对较高的情况下仍然受到了广大C++学习者的热烈欢迎。几年过去,相信已经有不少读者通过这本书掌握了C++基础语言。在日常的程序设计实践中,该书也是相当出色的参考手册。关于C++语言本身的各种问题,几乎都可以在这本书里找到答案。全面,被认为是C++ Primer的特色。但事实上,第三版不是一般的全面,其全面和详尽的程度不仅大大超过了一本名为“Primer(入门)”的图书所应该达到的程度,也远远超过前两版的水平。之所以会如此,实际上有深层的原因。

    C++ Primer第三版写作时,C++语言ISO标准已经落定。人们在等待了很长时间之后,似乎终于可以喘口气了。但是当时在C++社群里发生的很多事情表明,这部厚厚的语言标准里蕴藏着某些东西,使得整个社群不但不可能在其基础之上稍事休憩,反而还有可能迈入一个新的,或者激动人心,或者是兵荒马乱的变革时代。当时很多人已经认识到,标准C++的出现将带来C++编程风格的一次激烈变化,但是究竟会发生哪些变化?会对C++的其他方面产生怎样的影响?这些影响中哪些是经得起考验的?那些不过是那浮云?特别是,新的C++风格将给C++教育和C++图书的编写方式带来怎样的冲击?这些在当时都是无法预计的。传统的思路依然行之有效,新的变革却已经呼之欲出。那些必须讲解,那些可以抛弃,当时还不清楚。为了维系C++ Primer的“光荣传统”,只能是兼收并蓄,言无不尽。因此,Stan Lippman不得不把C++ Primer的第三版写成一本真正的“巨著”。他必须要在这本书里包含当时处于变革过渡状态下的C++的全部基本内容,必须既按照传统的思路来讲解C++基础知识、底层细节,又充分突出标准C++的新组件、新特色。这种做法的结果,C++ Primer 3/e的篇幅空前巨大,内容覆盖非常全面,然而其教学思路却体现出一种过渡时期不得以的犹豫不决。这种犹豫不决,直接表现为整本书在技术层次上全面而缺乏重点,高层技术与低级细节交织在一起,在风格上缺乏鲜明的倾向性。从正面看,Stan Lippman的这种保守做法保证了该书书的全面性传统,使得第三版成为极佳的使用手册。而从负面看,作为一本教程,这本书就远不是无可挑剔的了,至少其内容远非精炼,教学思路远非清晰。因此,这本书出版以来,在国外C++社群中的形象并不是一本教程,而是不折不扣的案头参考书。其结果,虽然无论是在语言使用上相对求稳的Douglas C. Schmidt,还是比较激进的Bjarne Stroustrup、Francis Glassborrow和Andrew Koenig,在向初学者推荐C++教程的时候,都没有把C++ Primer 3/e列入其中。相反,Andrew Koenig和Francis Glassborrow分别写了Accelerated C++和You Can Do It!,以表达自己对于新时代下C++教学思路和风格的观点。就连Stan Lippman本人也意识到这个问题,并写了一本Essential C++来弥补。

    让我们看看从那之后发生了什么。2001年,Andrei Alexandrescu的著作Modern C++ Design刷新了人们对于template能力的认识。稍后,Boost库开始成形并产生影响,逐渐将template在泛型和模板元编程方面的能力发挥到极致。大约在2002年,Bjarne Stroustrup意识到不必要地滥用template会严重地影响C++以应用为本的发展方向,于是通过自己主编的C++ In Depth系列开始予以矫正。类似Applied C++这样的实践型作品,在技术风格上虽然还有附庸风雅之嫌,但已经平易务实了很多。而Bjarne Stroustrup将C++ Network Programming列入C++ In Depth系列,无异于在事实上认可了ACE的务实主义风格。这种努力见到了明显的效果,在2003年之后,Boost库中新增的组件越来越务实,而近几年比较流行的C++专业图书,也多以实用性和领域知识制胜,而不再追求纯粹的语言技巧。我们从标准委员会先后提出的C++性能报告和C++ 0X TR1也可以看出,标准委员会对于纯粹语言技巧上的创新持审慎态度,而对于真正有益于提高生产效率的改进则不遗余力地予以支持。整个社群对于C++编程风格的讨论,也越来越趋向理性和务实。自动内存管理机制的必要性得到广泛的认同,Boost中一些风格和做法受到批评,对Python、Lua等脚本语言的态度也趋于友好,而过去一直背着“保守”和“异端”这是经过了长期的实践,总结了正面和反面的经验教训之后,整个C++社群做出的务实选择。

    C++ Primer第四版就是Stan Lippman在这样一种务实的气氛中,与合作者Josee Lajoie,Barbara Moo共同推出的。而且这次新加入创作团队的Barbara Moo,是C++大师Andy Koenig的夫人,Accelerated C++和Ruminations in C++的合作者,对于新风格C++的讲授有着充分的经验。本书整体思路的一些变化,显然受到了Barbara Moo的强烈影响,篇幅相对于第三版,已经大为精简。这主要是因为作者已经清楚地知道C++发展的必然方向,从而也就明白哪些内容不再必要,敢于大规模地精简。随着内容的精简,该书所倡导的C++风格也变得明晰起来。细心的读者会发现,第四版中把标准库中的string和vector放在数组和指针之前讲授,在第一部分的随后章节中,标准库的应用渗透其中,其意图在于让初学者首先建立标准库组件的概念,培养他们“以标准C++为母语”的自觉,这种做法对于年轻的C++初学者,应该能够产生巨大的示范意义,让他们能够在直觉之下写出更为安全和清晰的代码。

    更值得注意的是本书中对于“类”概念的讲述线索,可谓匠心独具。类作为C++表达概念的主要手段,在第二章中就开始讲授,随后才介绍各种语言要素和控制结构,这是为了使读者建立以类为中心的概念。然而有趣的是,本书并不像一般C++教程,在介绍类的基本概念之后急迫地介绍作为抽象数据结构的类,进而介绍面向对象程序设计,而是在基本语言元素讲述完毕之后,就进入标注库组件的全面介绍,这种体系可谓是前所未见,相当大胆。在介绍标注库之后,才回到基于对象级别上的类,接下来才是面向对象和泛型程序设计。我认为这种次序正是体现了几年来对于C++应用方式的反思结果,即:以类为中心,以标准库为基本设施,强调基于对象层次上的务实技术,而将面向对象和高级泛型编程作为提高内容。而全书收尾的第五部分,其主题已经涉及到C++语言中最为晦涩和容易出错的部分,绝对是“拔高篇”。这样一来,全书在技术上的层次感就非常分分明,与第三版形成了鲜明的对比。

    正因为C++ Primer第四版的这些变化,使得这本C++的经典著作重新恢复了教程的面貌,并且成为新时代C++程序设计风格的一个出色的注释。我相信,新一代的程序员,通过这本书来学习C++,可以形成更清晰的概念,建立更正确的直觉,形成更务实的风格,少走一些弯路和极端。而对于老手来说,这本书跟以前一样,还是出色的手册,而且在内容组织上条理更清晰。

    这几年来,C++的应用领域有所缩小,而相比之下,C++开发者的数量下降就更为迅速。事实上,而国际上高水平C++开发者相当紧缺,很多关键领域对于C++开发者的需求还是非常大的,这种语言的独特优势使它仍然具有良好的发展前景。希望C++ Primer第四版能够帮助更多的初学者迅速成为合格的C++程序员。

相关文章推荐

C++ Primer 【第四版】第十三章 复制控制

1. 什么是复制构造函数?何时使用它?        只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数叫复制构造函数。        copy con...

C++Primer第四版习题9.26答案调试出错的解决

C++Primer第四版习题9.26原答案调试出错的解决

C++ Primer中文版(第四版)-读书笔记【PartB】

上接PartA   p387 初始化列表 构造函数具有名字、形参表和函数体,例如 Sales_item::Sales_item(const string &book):isbn(book),u...

C++primer第四版第四章数组与指针

现代C++尽量不是用指针和数组,而是使用迭代器和string,vector。 数组是不能改变长度的,两个数组不能直接赋值来实现复制,两个数组不能直接比较大小,必须通过比较每个数组元素来比较大小。vec...

《C++ primer(第四版)》读书笔记4-编码规范

编写良好的泛型代码(534) 编写模板代码时,对实参类型的要求尽可能少是有益的 1)模板的形参是const引用(可以支持那些不支持复制构造函数类型的类;对于大类型对象,速度更快,因为不是复...

《C++ Primer第四版》学习笔记(七)变量和基本类型 - typedef、枚举、类

typedef 三种目的: 1. 为了隐藏特性的实现,强调使用类型的目的 2. 简化复杂的类型定义,使其更容易理解 3. 允许一种类型用于多个目的,同时使得每次使用该类型的目的明确(API...

C++ Primer 【第四版】第十五章 面向对象编程

第十五章 面向对象编程 1。什么是虚成员? 在类中被声明为virtual的成员,基类希望这种成员在派生类中重定义。除了构造函数外,任意非static成员都可以为虚成员。   2...

C++ Primer 第四版读书笔记(一)之变量和基本类型

C++语言定义了几种基本类型:字符型、整形、浮点型等。 1、基本内置类型 C++定义了一组表示整数、浮点数、单个字符和布尔值的算术类型,另外还定义了一种称为void的特殊类型。 表1.1...

C++ Primer(第四版)笔记

文摘和总结: 模板和泛编程 1.类模板的成员函数只有为程序使用才进行实例化.如果某函数从未使用,则不会实例化该成员函数. 2.非类型模板实参必须是编译时常量表达式. 3.当成员模板是类模板的成员时,它...

C++Primer (第四版) 第四章 数组和指针

第四张 数组和指针 与vector类型相比,数组的显著缺陷在于:数组的长度是固定的,而且程序员无法知道一个给定数组的长度。数组没有获取其容量大小的size操作,也不提供push_back操作在其中...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:看孟岩对C++ PRIMER第四版所写的书评
举报原因:
原因补充:

(最多只允许输入30个字)