关于C++的扯淡_C++ Primer中文版书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 科技 > C++ Primer中文版 > 关于C++的扯淡
LUCKYsama C++ Primer中文版 的书评 发表时间:2009-01-29 19:01:34

关于C++的扯淡


今天下午在看C++Primer的时候跟同学东扯西扯一些乱七八糟的东西就填在这里。这本书还真的是不错的。

C++ 的诞生大约是在1980-1983年。总之我的一直以来的基本观点是,C++当初的诞生一定不是为了现在面向对象方法论上教授的那些扯淡的东西……什么把一个类的数据封装起来,只提供Get()和Set()接口来提高它的安全性啦,什么画一个业务流程图再转化为类图啦,之类的。C++的诞生离计算机的企业级大规模应用和面向对象设计方法论的诞生还有一段时间,它的作者是在想完成一些别的什么东西,一些比较特别的,在软件工程里面从未提到过的目标,嗯……

虽然读了四年计算机系,但是因为一直在用C#和Java这类比较傻的语言,导致我个人对C++的接触过少……考完算法课就完事了。最近一直在被老板抽着写 C++程序,才终于对C++的理解稍微深入一些。事实上,C离C++之间只隔了7年,而数据类型这个概念是在C里面才引进的。在1973年之前,程序看到的就是一个一个的内存字节。短短7年的时间内,从C的数据类型演化为C++的数据与操作的集合称为“类”可以作为数据类型,这中间演化的动机,如果说是企业的ERP系统的需要,那是不可想象的。

如果用我扯淡的目光看来,最初的把操作和数据打包形成“类”作为数据类型的需求,可能源自运算符重载的需要。最初的动机可能在String类型之间没法进行大小比较,也没法赋值。因为char *显然做不到这两点。这个时候,工程师们意识到CPU对于数值的那一套指令集不能满足更多的类型的需要。如果所有新的类型都要能像经典的int一样能干这个那个,就必须能够让类的实例的行为可以自定义地编程。这个设计一口气诞生了两个结果,第一是伟大的操作和数据打包成为面向对象的“类”概念,第2是运算符重载。

但是,C++设计者的野心并没有就此打住。(如果是这样的话他们可能就发明了Java……)如果说对于任何的数据类型都可以比大小的话,那么“比大小”这件事情和与“比大小”有关的事情就不具有特定类型的语义了。我们应该能写一段程序,既能给int比大小,也能给 char比大小,也能给String比大小——于是,模版诞生了。模版的最主要贡献是类型代数;通过模版,我们只要写出对于一些代数符号的算法,然后把具体的类型代进去就可以了。

不过如果C++只是个有模版的语言的话那么模版和公共的纯虚接口类其实也没大区别,而C++的设计也远没有在此停下。它的设计者意识到,总体上来说,算法这种东西并不是普适的。一个“算法”一定作用于一群对象,(如果只作用于单个对象,那么该算法应该是该对象的成员方法而不是独立之外的东西)而这一群对象并不是任意选定的。例如,“排序”算法只有对能比出谁大谁小的一堆对象才能进行。(更严格地说,是对一堆能够选出可比较的键值的对象)如果比较对象是“红色”和“蓝色”,那任你怎么先进的排序算法也算不出个所以然来。换句话说,在C++的观点里,算法是作用于具有特定特性的对象集合的一组操作 。注意,这里的特性指的是这个集合 的特性而并非每个对象自身的特性。例如,“排序”算法只有作用于那些良序的或者说可以比较大小的集合上才有作用。在之前,我们已经有了强大模版;模版实现了针对单个对象的数据类型的抽象。此刻,我们需要一个对于一组对象构成的集合的特性的抽象:此时C++引进了容器和迭代器。

容器是一组以模版形式出现的泛型按照一定的规则构成的集合,而迭代器提供了符合这个集合特性的访问方法。它们是对数据结构的第二次抽象,在这层抽象上,C++开始讲述算法。此时,算法就是可以应用于一系列容器的操作的总和。在这个时候,不但具体的数据类型已经随着模版的抽象而消失,就连这种数据类型构成的集合本身 都已经随着容器到迭代器的抽象而消失了。(C++算法只能访问迭代器,而不能访问容器自身)算法面对的是纯粹的,由迭代器表达出来的“关系”;例如排序算法,它为之工作的目标只是一个“能够比较大小的”迭代器,以及这个队列的头和尾而已。具体提供这个迭代器的容器是vector还是map,算法并不知情。

C++Primer甚至赤裸裸地指出,C++中所有的算法都应该采取以下4种形式中的1种:

alg(beg, end, other params)

alg(beg, end, dest, other params)

alg(beg, end, beg2, other params)

alg(beg, end, beg2, end2, other params)

这简直就跟当年讨论图灵可计算性的理论在暴力和狂热程度上没有任何区别。尽管作者出于礼貌地写出了other params,不过C++的理想和信念就是只要透过前面那些参数,基于泛型容器的C++可以让任何的算法都用那前面的几个参数实现。换句话说,C++的设计目标,毫无疑问,是透过对于数据结构自身和对于数据结构的集合的双重抽象最终可以让程序员写出像数学公式一样“纯粹”的算法,这些算法应该只基于迭代器实现,它们应该优美、庄重、典雅,并且就像F=ma一样万年不变。 现在看来,STL尽管还在每年修修补补,不过C++设计的这项初衷应该算是部分达到了吧。

最后提一下C++和OO以及软件工程的区别。说实话,它们除了在把操作和数据一起打包成对象,并且对象可以继承这点上有偶然的巧合外,其余部分联系不大。 C++承认了OO对于世界万物皆为对象,并且对象之间应该存在着层级抽象关系的世界观,但是这只是工具而并非方向;就像大碗岛的下午描述的是海滩——然而它的重点并非华丽的男女,而是指出点彩法的运用——一样。

展开全文
有用 131 无用 12

您对该书评有什么想说的?

发 表

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

对“关于C++的扯淡”的回应

十八哥 2016-09-22 14:37:20

楼主很有想法~~

鹤舞清风 2016-01-27 22:17:18

楼主写的真的很棒,风格和本座很像,楼主现在在哪里?

依云 2015-06-11 19:48:25

你应该去学学 Haskell。

xyyiii 2015-02-25 21:35:26

初学C++的时候也被STL的做法惊叹。不过这本书很难。。。太TMD难了

2015-01-30 19:08:44

LZ凭一己之力能有这么多思考确实让人佩服,但其实猜想的大多与实事不符,可能会误导新人,所以要-1

athos 2014-12-14 11:29:43

C++的多种风格混合可以参考Scott Meyers的effective c++

五指不见伸手 2014-01-07 23:20:06

如果想了解 C++ 的设计哲学和理念,确实要好好看看《C++ 语言的设计和演化》,和楼主的描述完全不一样啊。

很庆幸当年买了并看了那本书。

[已注销] 2013-09-04 13:37:55

同推荐 c++设计与演化

辍学卖切糕 2013-06-07 17:18:57

说得好!c++ 的算法的抽象,让工业领域更注重于实现的思路而不是底层的算法

兵城 2013-05-30 12:47:40

说得挺好的 ,顶!

程泽野 2012-12-11 23:03:13

看了BS的C++语言的设计与演化,LZ的描述很多不准确啊

还是推荐大家去看BS的书来了解C++的演化吧

LeslieYuan 2012-10-28 00:32:41

看完了C和数据结构与算法,准备开始看这么本书了。一定要学好c/c++和python啊。目标

[已注销] 2012-09-16 21:56:12

正在读,进程较慢......
非计算机专业的学生伤不起啊

jack 2011-09-30 14:10:32

想学但是没看懂

doudou 2011-09-04 21:03:53

lz的评论独辟蹊径啊

Ptolemaeus 2011-07-23 20:17:48

我今天才知道Loki

方向 2011-01-15 14:15:54

对C++更近一步的了解了

2010-11-25 19:41:19

感觉太高估容器和迭代器的历史意义了
听侯捷说模板的更高层次应用是Loki库——用C++模板的实现的各种设计模式。(《现代C++设计》)

way_for_BMG 2010-07-25 22:09:09

突然很想知道,LZ贵庚???

老杰胡 2010-04-28 12:36:53

LZ,受教了啊,

柚原 2010-04-24 14:49:13

你写的很丰富~赞

某人的马甲 2010-03-17 20:58:16

平时当成工具书看,挺不错……

mengxr 2009-12-24 11:20:27

2009-03-31 23:08:45 fuzzycozy
  看来有必要为了学习STL买本C++ Primer
应该买bj的C++程序设计第三版吧。。。

mengxr 2009-12-24 11:19:08

以前我一直迷恋boost之类的template应用,还有设计模式,现在却越来越爱上c语言了哈,

Apull 2009-12-18 09:50:44

正准备看呢。你写的很不错~~

Fighting 2009-11-06 15:48:55

买了一本英文版的 30元。呵呵。期待!

jevin 2009-10-14 18:21:56

很好,刚从天府书城买了这本书

liangc 2009-10-06 12:21:07

C++的创造者Bjarne Stroustrup写的另外一本书the design and evolution of C++解答了所有关于C++本身的疑惑,因为这本书并不多见,所以不多人读过

compactset 2009-06-19 16:40:24

c++的类机制是从Simula里演化过来的, BS当年为了写博士论文, 课题是分布式系统的仿真研究,开发语言用的是Simula, 他发现Simula做大规模软件开发有很多优点,但是运行效率太低,比低级的BPCL慢多了, 觉得不爽。正好他在搞分布式系统研究的时候出于需要,研究了Unix内核, 于是顺带学了C语言,他就把C语言和Simula的优点整合起来,加了点ALGOL 68, Ada, CLU , ML的特点,在俺1岁的时候搞出了带类的C。 至于改名C++则是到俺5岁的时候了。

刘总推荐的the design and evolution of C++很不错,不过不好找,我正版实在买不到,只好买了盗版的,pdf的看的太累, 不好意思了。

刘江 2009-04-19 02:06:17

短短7年的时间内,从C的数据类型演化为C++的数据与操作的集合称为“类”可以作为数据类型,这中间演化的动机,如果说是企业的ERP系统的需要,那是不可想象的。

这段话不靠谱,面向对象概念早在C之前就有了。建议你读一下BS的C++演化那本书。

chilema 2009-03-31 23:08:45

看来有必要为了学习STL买本C++ Primer

江南游子 2009-03-14 22:58:08

太长了……没看完

cute 2009-02-13 00:21:33

不错,正在断断续续的读

浮一大白 2009-02-10 12:39:56

好文章

2009-02-10 11:25:17

写的不错啊

int cmp 2009-02-03 12:38:34

挺好的……当初搞奥赛只是草草读了一下 学了个C--