谈谈怎样读《C++primer 3、4两版》

来源:互联网 发布:九章算法 视频 下载 编辑:程序博客网 时间:2024/06/08 14:16

谈谈怎样读《C++primer 34两版》

C++primer是公认的经典著作,网上一些常见提法我觉得容易误导真正的初学者,对此我心中很不安。我是一个老汉,64岁了,编过10年的程序,讲过14年的CC++、和软件工程。我要诚实地告诉青年朋友们,我并没有详细地阅读这两本书,仅仅是浏览而已,按说无资格发言,但是我仍然忍不住要对年轻人说几句,不妥之处在所难免,欢迎大家指正。

首先我要表达对作者的钦佩之情。

书是最新的知识,体现的就是一个新字,看!讲了那么多的标准模板库,这是C++最新的研究成果,也是实际编程所推荐的方式。

以上是我与朋友们相同的认识。下面我要对几个问题提出我的不同看法。

一、这部书适合初学者吗?

我不相信这部书适合初学者,尽管它里面包含了几乎所有的基础的知识。我无比坚信的是这本书不会有任何一个学校作为教科书或教师的讲义稿,都是1000多页的鸿篇巨制啊!作为教程则时间上篇幅上显然不合适。

  看看第3版译者是怎么说的吧,潘爱民在翻译第3版的序中说,“虽然本书书名《C++ primer》的含义是“C++初级读本”,但它绝不是一本很轻松的入门教材”。

本书的作者却说可以作为‘学习C++的第一本书’,但是又说:‘不是学习程序设计的第一本书’,这是什么意思呢?是说要有其他程序设计语言的基础?我猜不出来。

如果天下真有C++零基础的初学者适应这本书,那么这种人有什么必要条件呢?

1. 特别聪明,跟作者一样聪明,比潘爱民聪明,跟陈老师一样聪明那就完蛋了。

2. 有一位教学经验比较丰富的老师在您身边随时指导您,例如请我(陈老师吹牛啦),不过您起码得管饭。

3. 您必须有一段很宽裕的时间,一个月肯定不行。如果您是学生,您将在考研中名落孙山;如果您不是学生,那您将失去工作和收入。据说洋人有此魄力者较多,这往往使得洋人能出人才,例如比尔盖茨。

总而言之一句话,我们不得不考虑时间这个约束条件。好在我们中国理工科大学都学一个学期的C语言,计算机专业的还要学一学期的C++,所以一般不会有人落入我吓唬您的这种困境。但有了这个基础您可不再是初学者了。

二、人们误解本书适用初学者的一个原因

   正如朋友们所说的,这部书含有国内流行教材的几乎所有的内容,而且讲得更好,讲得更细,甚至有些朋友说比谭浩强老爷子更‘磨叨’。

三、我认为这本书适用的人群

应该学过C++,不一定学得有多好,但一定要对数据类型、基本运算、基本流程控制、函数、简单指针、一维数组比较扎实,对封装、继承、多态的机制和模板函数、模板类有一定理解。您最好学过C++描述的数据结构,这对阅读这本书太有利了。

现在国内计算机信息类的毕业生一般都具有这点起码的要求,当这些毕业生进入到IT行业用C++编程时适合这本书,但千万别一头扎进去。

四、我对标准库的认识

先讲个故事,巧嘴燕子和笨嘴蛤蟆比数数,燕子:“1234567...”,蛤蟆一张嘴:“俩5”。

面向对象的技术之所以能风行,是因为继承性和多态性实现了代码的复用。代码复用就是“俩5”。

   标准模板库STL是“俩6”,不过这个“俩6”使用的范围有限。标准类模板库中的容器类最大的用武之地就是在大量的数据形成一些数据结构的情况,但是并不是所有的软件项目都有大量的数据并且形成诸如,数组、队列、栈、树等。这时我们的标准类模板库可就没多大用武之地了。您可能提出,像sringvector几乎是什么程序都是用的啊?但是用字符串函数和数组代替也并不复杂。如控制方面的程序、图像处理方面的程序我猜测就很难用到标准模板库。

您看侯捷的《深入浅出MFC》里,没有讲一点标准模板库,至今一点没过时。

休说是标准模板库,就是不面向对象的C语言至今也没听说就过时了。

五、大师的担心多虑了

先讲一个真实的故事。某少年宫小提琴班早先请的是一位小学音乐老师,后来换了一位专业退休的小提琴家。小提琴家让这群孩子表演一下,结果小孩没傻,小提琴家傻了。他说让我教也行,但是要换一批孩子,这群孩子的毛病是改不过来了。

看看本书的担心吧:

“多数C++教材按照下面的顺序展开:先讲低级细节,在介绍更高级的语言特性,在讲完整个语言后才开始解释标准库。结果往往是读者纠缠于低级的程序设计问题和复杂类型定义的编写等细节,而不能真正领会编程的强大,更不用说学到足够的知识去创建自己的抽象了。”

明白了吧?我们这位‘小提琴家’要让他的学生从拿起小提琴的那一天起,就要立身中正、持琴端正、手型正确,不能随心所欲,否则就改不过来了。大师为了让我们从一开始就养成良好的编程习惯,怎么办呢?

请看大师是怎么说的吧:“本版中我们独辟蹊径。一开始就讲述语言的基础知识和标准库,这样读者就可以写出比较的的有实际意义的程序来,透彻阐述了使用标准库的基础之后,我们才进入下一步,。。。”。

“为了体现现代C++编程风格,我们重新组织并重写了本书,书中不再强调底层编程技术,而把中心转向标准库的使用。书中很早就开始介绍标准库。。。。。。”。

我愚且钝,窃以为大师的担心是多余的。让我们回顾历史,在面向对象的技术出现之前,人们都是面向过程的,现在还不都改的挺好?也没见谁落下了“纠缠于低级的程序设计问题”的病根。展望未来,C++可能还出现更新的技术,到那时标准模板库又成了‘低级的程序设计问题’,那我们的大师怎么办?

我窃以为学编程跟学小提琴是不一样的,只要经过注意点,很容易培养成尽可能使用标准模板库的习惯。我老汉目前尚未养成尽量使用有标准模板库的习惯,咱们可以打赌,只要您能出钱,我就能把我曾经编过的《计量证书管理程序》使用标准模板库重新写一遍,但要卖给您,然后公开源代码。我原来是自己写的链表,现在使用标准模板库容器类list

   糟糕的是本书把这些基本内容与标准模板库混在一起,那就需要您能正确对待标准模板库,但对于C++零基础的初学者能做到吗?

这就像数学家写小学算术课本,旨在“一开始就养成微积分的思维习惯”。您看合适吗?

我坚决相信,如果不是大师的特立独行,这本书将更受欢迎。

六、大师提倡使用标准库的一个原因竟然是减少对指针的需要。

   看看本书自己是怎么说的吧:“本书始终提倡使用标准库。这样做的一个原因是,使用标准库能够大大减少现代C++对指针的需要......”,真是让人大吃一惊。

那么真的能大大减少“C++对指针的需要”吗?我没看出来。我反而看到的是作者在讲函数和指针这两个内容时,指针一点也没少讲。实际上,使用C++里要想逃过指针那是没门,只有一个办法,彻底掌握它。

七、如果非要以此书作教材,我将怎样教学生

前面开过玩笑,说您如果是初学者,请我指导您就行。那么我将怎么指导您呢?

咱们继续把这个玩笑开下去,谁让您有那么好的经济条件呢?咱们还能按书自身的顺序讲,相信吗?我的原则是每遇到标准模板库STL时我要让您坚决克服一切心理障碍,务必不要问任何为什么,顽强地照猫画虎地照搬套用。在学到所谓“低级细节”时,咱们再按书细细地学,这样当咱们学到类模板和函数模板时您就能大概地理解标准模板库STL了。何时能清楚地理解标准模板库STL呢?那还要等到您学完了面向对象的数据结构之后。

七、非超常智力的人应怎样阅读和使用本书

如果您是在校的本科生建议您不必看这本书,至少是老师没讲的东西别看。如果您是研究生,还是建议您先别看,君不见本书的名字是primer吗?您的论文不会是primer吧?如果您是新毕业生,这本书对于您找工作恐怕不适用。如果您找到了IT方面的工作是网络方面的,您干脆去复习java吧。总之一句话,您要先找饭碗。在您没找到饭碗之前,我看本书不适合于您,如果您不需要饭碗,那就另当别论了。

如果您找到了编程工作并且不是网络和控制方面的,那这本书就可能适合您了。由于您已经学过模板和面向对象的数据结构,这里讲的无非就是使用,对您来说是名副其实的primer,您正式编写的第一个实用程序,就是以使用标准模板库STL的良好习惯开始,您是当前程序员里最摩登的人啦!

您会发现,本书不仅时髦,就是那些被它成为“低级细节”的内容都将的很细,很磨叨,很适合中国高考培养出来的您的习惯,您可能会爱不释手。这时陈老汉要奉劝您该释手时就释手。

还是我那句话,您要立足先保住饭碗,这书太厚了,凡是跟您当前工作无关的内容最好别钻研进去,但可以浏览。只要您基本功扎实,您何时看都不迟。

尽管此书介绍的标准模板库已经不少,但仍然是比较常见的,真正编程时还是有可能查阅更专门的标准模板库的资料。

我建议朋友们把这本书作为一个大字典来对待。它的内容丰富,但并不深入,这就是作者命名‘primer’的原因。

我把此书比作康熙大字典,而不是滕王阁序和岳阳楼记。而大师所写的另一本名著《深度探索C++对象模型》才是岳阳楼记呢。

八、我怎样看待名著?

古代读书人背下《道德经》、《论语》等名著大有人在。时代不同了,如今是知识大爆炸的时代,而计算机又是重点爆炸的学科。C++C语言、软件工程以及其它有关内容浩如烟海,犹如钱塘大潮立体向我们淹没而来。我们像沧海一粟那么渺小,我们的生命是那样的短促,而编程经典的书籍又那么多,我们必须学会面对,这就是我所以写这篇文章的初衷。作为编程战线上一个遍体鳞伤的老兵,一个撞过无数次南墙还没干出什么正经事的老兵希望年轻人吸取我的教训和经验。

首先您要把最基本的部分必须真正掌握,包括:数据类型、基本运算、基本流程控制、函数、指针、一维数组、基本文件、类、封装、继承、多态。其余基本掌握就行,如用指向一维数组的指针处理二维数组的内容不好懂不必这儿吊死,其实您即使做了程序员,也一辈子用不上二维数组。

有了基本知识的掌握,您就应该找饭碗,要从饭碗出发,用什么学什么,用多少,学多少。要采用‘滚雪球’的方法来应对,您的饭碗就是雪球的中心。您别指望把所有的编程知识都学会之后再来编程,那样您60岁了还没编过程序呢。

当您有了稳定的饭碗,当您有闲暇的时候,建议您在名著里走马观花,尤其是在比较相关的名著里徜徉,但这必须有坚实的基本功做基础。

计算机名著跟文学名著不同,可以整章节的扔掉,而不受影响。

   本书许多内容都可作为字典来使用。你不可能在开口说话之前把字典上的词都学会,而是等到在阅读和会话中遇到生词时去查阅。您也可以在闲暇时浏览字典,将来在阅读和写作需要时,再来详细查阅某个单词,例如volatile限定符。

   

   我还想说的是,我们也不必过于迷信名著。不一定每本名著都适合于您,更不是每一章节都要钻研,那在时间和精力上是不现实的。有的书确实被称为名著,如C陷阱与缺陷》,其内容基本上我早就知道,所以对我个人的意义就不大。有谁比名著的作者更会看待名著,让我们看看本书作者在3版前言里说的一段话,他长久地萦绕在我的脑海里:

“最后,我们要说的是,无论谁写了一本书,他所省略掉的,往往与他所讲述的内容一样重要......”。

看到了吧?大师的头脑多么清醒,真是满腹经纶!

别以为名著就写的很深入,这本书就不深入,它立足于‘用’和‘新’。

不要以某本名著做尺子去衡量其它的书。如果有人以本书讲了一堆的标准模板库STL为尺子,据此认为凡是没讲STL的书都过时了,那么我怀疑此人是否真理解了STL

别以为计算机名著会像文史哲名著那样永恒。

九、我们怎样写名著?

朋友们看到这个标题一定是以为我酒喝多了,其实博客本身允许在一定程度上胡扯。别着急,您向下看。

我认为写名著必须有以下条件:

1.有写名著的本事。我肯定没有,中国人里侯捷有。

2.别指望你写出的书会成为名著,越指望越没戏。

3.从内容到形式都不能过于模仿名著,仿名著者死。美女不同面,东施莫效颦。

十、斗胆给名著提意见和建议

1.本书例子相对太少,许多叙述如果改用例子叙述的话,效果将更好。

2.本书例图实在是太少了,一图抵千言。小学生为啥要看图识字啊?看来大师不善于教小学。

3.本书的独辟蹊径并不成功。“本版中我们独辟蹊径。一开始就讲述语言的基础知识和标准库”,还不如按‘常规办事’。

3.标准库使用方面的讲述篇幅也未免太多,我估计在第四版都不少于1/4。作者不如再专门写一本标准库使用说明书。

4.继承性和虚函数机制讲得相对太少。

5.整本书都少见讲到 new,而动态内存分配运算符new是非常重要的。

十一、结束语

   在中国批评大师是件危险的事情,但我还是相信朋友们会理解我的善意。我的水平相当于一个小学老师,但教过的零基础的初学者自认为比大师多。作者是“独立咨询顾问”,啥意思?教授的教授。但是教授写小学课本也会有不合适的地方。

最后,让我们重温书中的话:“无数程序员已经利用本书的前几个版本学习了C++”。和百度百科里的介绍:“本书是久负盛名的C++经典教程......。已经帮助全球无数程序员学会了C++”。

看!是程序员,没说是大一、大二的娃娃。

 

原创粉丝点击