c++学习阶段分析
C++学习阶段分析
今天终于看完了给自己列过的c++书单,有一种如释重负的感觉。同时也让我认识到了c++的博大精深。以前用VC编程,写窗体程序以为自己对c++就很熟悉了,现在想想当初的天真真是惭愧。下面我结合自己学习c++的过程,谈谈对c++语法学习的感悟。
一、C++广为人知的一半
面向对象是C++广为人知的一半,但如何学好它,却不是一件容易的事。
1、入门阶段
抽象,继承,多态是很多刚开始学习c++的人对c++的认识。对于抽象,继承,比较容易了解。而多态,则让很多人认为神秘莫测。我想每一个学习c++的人都会在开始时对c++的多态有这么一种神秘感。
看看这个阶段的书籍,找一本市面上讲C++语法的书籍,同时附上C++创始人Bjarne Stroustrup执笔的鸿篇巨制:《The C++ Programming Language》。之所以要从一本容易的C++语法书开始,是为了保持我们的信心。有了一定的基础后,不要一叶障目不见泰山,我们该去看看C++创始人Bjarne Stroustrup执笔的鸿篇巨制:《The C++ Programming Language》。这本书对C++的所有语法进行了系统的介绍,高屋建瓴的介绍了C++语言,这也是为啥不一开始就看这本书原因。牛人的书意境是很深的,要有一定的功底才可以看的懂。好了,看了这本书后,我相信你不会和我再犯同样的错误了:学了一本C++的语法书,懂了抽象、继承,多态还蒙着半层面纱就敢说自己熟悉C++了。因为你知道c++除了抽象,继承,多态这些面向对象的性质之外,还有就是和面向对象相对的泛型编程:C++模板编程。好了,我们暂且不要好高骛远,先把这些基本的搞定再说。
2、熟悉阶段
我们入门了。如果你想有所作为,那你就不要停下脚步。古语日:“书读百遍,其义自现”。但在程序设计的世界里,书是要读的,但仅仅读书是不行的。我们还需要实践,对,写程序。有了对抽象,继承,多态的认识,我们就可以用面向对象的思想进行编程了。当然了,面向对象的思想不是容易掌握的,我们要在写程序的过程中不断的体会,琢磨。当你写程序到一定的数量的时候,你会发现自己犯过很多错,有一种将这种错误分门别类的想法。恭喜你,你升级了。
3、提升阶段
不烦你将自己犯过的错误分门别类了。因为前人已经进行了总结。这时你就奇怪了,既然有前人总结的经验,你为啥不在我犯错之前告诉我呢。很抱歉,不是我不愿意,因为在你犯错之前如果我禁止你这样,禁止你那样,你会觉得自己无所适从,不知道该如何去写程序了。同时你也不会明白为啥不能那样做。好了,有了犯错的经验,我们可以去看前人总结的犯错宝典了。第一本书: 《effective c++》,前人总结的50条c++编程法则,没编过程序的人不要去看。第二本书:《c++编程思想:第一卷》从思想上指导我们进行c++编程,为我们后期的学习做准备。
4、揭开C++多态的神秘面纱
总结了错误的法则,有了编程思想的指导,你是不是想试试你的功底了。是的,我们该检验我们的思想是否到家了。如何办:做项目。好的,那就做吧。当你做项目的时候,你学会了用虚函数,学会了C++的多态,但是你想了解这多态到底是如何实现的,它神秘的面纱后面到底是啥。这个时候,它可以满足你的要求:《深度探索c++对象模型》,它从编译器的角度,讲叙了C++多态的底层机制。当然它还包含其它精彩的内容,是不是等不及了,那就去读它吧。
二、C++被人忽视的一半
也许揭开c++的神秘面纱之后,你会认为自己已经了解了C++的所有语法了。我想在入门阶段读过《The C++ Programming Language》的人,他们很清楚自己现在还只是站在C++圣殿的半山腰上,前面还有更高的意境等待着我们的思考。革命尚未成功,同志仍需努力。
1、泛型编程入门:
也许你会说,泛型编程离我太远,我没用到。呵呵,这就是你不知情了吧。要知道,C++中我们使用的很多库,都是由泛型编程来实现的。我们编程用到的IOSTREAM,就是一例。当然了,最有名的要数我们的STL标准模板库了,你要知道C++98标准可是因为它推迟了几年才出台的,要不可能就叫C++94标准了。从这里可以看出C++泛型编程的重要性了吧。好了,下面开始好书推荐:《c++ templates》,绝对是将C++泛型编程的语法讲的最清楚的一本书,不过不适合初学者,但到现在我也没有找到一本更合适的入门书籍,那就从它开始吧。
2、泛型编程进阶:
开始了,我们要走出泛型编程的第一步。是不是我们该动手开始写泛型程序了,且慢,不要着急,我们先看看前辈们的作品。用一下STL标准模板库,没用过别告诉我你用C++写过项目。先推荐几本好书:《c++标准程序库》,模板编程的最成功作品。去看看这本书吧,里面有很多实例,可以边看边写程序。《SGI STL源码剖析》,向专家取经,学习内存管理,算法,数据结构泛型编程的技法。
3、泛型编程提高:
有了前面的基础,我们在来看看泛型编程的进一步发展。《泛型思想》,一探泛型编程的宏观和微观。《多型与虚拟》,泛型和面向对象的完美结合。
三、C++的统一
好了,经过上面的两个阶段,我们基本学完了c++的语法。下面我们来看看,通过c++可以实现啥。
com一个更好的c++。
你想进一步提升自己的实力吗,你想成为c++的精通者吗。那就学com吧。也学你认为com过时了,没用了。告诉你,那是浮躁的人说的话。有一句话讲的经典,流行不是用来追的,而是用来等的。还告诉你,windows系列操作系统,com无所不在。微软的技术具有传承型,由VC到.net,他们之间有联系,当然更有进步。由com,dcom到com+,他们是一脉相承的。VC中就不说了。.net框架中其逻辑层就包含有.net中的企业服务(com+)。好了,下面我们看看com的学习过程把。
1、Com入门:
Com是一种思想,不是一种编程语言,在这里谈论它是因为我们要用C++将这种思想实现。在实现的过程中,我们可以从二进制级别来研究C++对象在内存中的布局。好书推荐:
看过《深度探索c++对象模型》的同志,恭喜你,可以直接看有关C++进行com编程的书籍了。否则,回去看过《深度探索c++对象模型》再来。《Inside com》,一本讲叙com基本原理的书,配有丰富的实例,很不错。《Essential COM》以C++为引子,从本质上解析com的实现,迄今为止,将com解析的最透彻的一本书。
2、实战com:
《深入解析ATL》,将C++泛型编程和面向对象编程结合的典范,简化了我们用C++开发COM的流程。
经过三个阶段的学习,我们对C++有了充分的了解。下面我们就享受它给我们带来的乐趣。COME ON , ENJOY IT.
附书单:
《The C++ Programming Language》
《c++编程思想:第一卷》
《c++编程思想:第二卷》
《c++标准程序库》
《effective c++》
《more effective c++》
《STL源码剖析》
《c++ templates》
《泛型思想》
《多型与虚拟》
《Inside com》
《Essential COM》
《深度探索c++对象模型》
《深入解析ATL》
《深入浅出MFC》
[解决办法]
楼主太强大了 都看完啦 ?
不知楼主看了多久?
[解决办法]
我还在第一阶段飘摇 O(∩_∩)O
[解决办法]
楼主也太牛了吧,用了多久?
[解决办法]
我发现我现在还是个C++初学者。
[解决办法]
吃不消 ...自卑阿!
[解决办法]
好像是林语堂给出的学习英语的建议是:“用得着的就学,用不着的就不学”,此建议适合对C++的学习。
[解决办法]
呃,果然是博大精深啊……
[解决办法]
The C++ Programming Language
这本书,我不觉得是入门的人该看的。因为它是为入门的人写的。应该是有点编程基础的人看的。
[解决办法]
楼主有毅力啊。向你致敬!
[解决办法]
卖书吗?要看这么多?
[解决办法]
mark and study and practice!
I am waiting for being a good C++er!
[解决办法]
对泛型编程感兴趣。
[解决办法]
顶··
[解决办法]
C++的博大精深我还没有体会到哦,我才开始学!初学不太懂
[解决办法]
恩,不错
以后要多加练习
[解决办法]
LZ真牛~~~我也得学习学习奋斗奋斗~~
[解决办法]
只是浏览过其中几本..
感觉世界没有尽头..
[解决办法]
我一直就觉得C++很深奥,没想到这么深奥,不过我不怕,不就是慢慢学吗,总能够成功的!~
[解决办法]
呵呵,LZ的话于我心有戚戚焉,
《The C++ Programming Language》
《c++标准程序库》
《effective c++》
《c++ templates》
《深度探索c++对象模型》
这几本我都看完了,《深度探索C++对象模型》是今天才看完的,还想再看一遍,总觉得意犹未尽,
《The C++ Programming Language》,你用高屋建瓴形容BS的讲解,我用醍醐灌顶形容读书的感受,
《C++ Standard Library》这书我也几乎从头到尾看了,觉得不需要这么看,大致浏览一下,
需要哪个容器、算法再具体看就是了,通读似乎不是很有意义,我个人观点,
《Effective C++》实在是太实用了,看了两三遍了,时常拿出来翻几页,
尤其是求职的时候,面试笔试、居家旅行必备,《More Effective C++》我没看过,
但我看过《Exceptional C++》,感觉这个也是很实用的东西,
讲的都是比《Effective c++》里面的东西更容易犯的错误。
《C++ Template》这书我硬着头皮看完了,说实话,实在枯燥,
要不是这东西很有用,我估计自己看不完,但是因为没有足够多的模板编写经验,
基本上不能掌握这本书的精髓,顶多是看到模板的时候多少明白人家是在干什么了。
倒是《C++编程思想》我只是简单看了个开头,看不下去了,感觉跟我的思考方式不搭调,
中英文版的《C++编程思想第一卷》我都有,可怎么也看不下去,也不想尝试了,可能是这个作者就是不适合我。
接下来想看的书:
《The C++ Programming Language》
《more effective c++》
《Effective STL》
《STL源码剖析》
《Essential COM》
《深度探索c++对象模型》
《C++语言的设计与演化》
------------以上是C++相关的--------------
《Win32多线程程序设计》
《代码大全》
《设计模式》
《程序设计实践》
其中:
《The C++ Programming Language》
《深度探索c++对象模型》
打算随时翻翻,因为第一次看的时候总有些东西感觉不甚透彻。
至于下面那四本跟C++没关系的书,我觉得是对使用C++提供支持的知识。
这计划我自己都没什么信心,不过我清楚这是个长期计划,我初步计划三--四年看完这些书。
根本没有速成的打算,因为经过了对“捷径”探索后发现“临渊羡鱼不如退而结网”
所谓“人间正道是沧桑”,自己以前总想在一年以内“学好C++”那种想法现在都觉得可笑。
等我看完了这些书也要上来发个贴子,显摆显摆, 呵呵,希望能有那一天。
[解决办法]
mk
[解决办法]
别的不知道
但编程思想第一卷是领教了
一个是这书真的是不错
二是翻译的太烂了
[解决办法]
仍处在primer阶段~~
[解决办法]
sf
[解决办法]
强呀。的学习学习
[解决办法]
都是牛人
[解决办法]
看老书的真多。。。不是说看经典老书不好,但至少也要关注下新书,摩尔定律摆在那里。。。
Herb Sutter的101也出了这么久了,虽然和《effective c++》系列有重复,但你能说这书不好吗?可是就没见几个人推荐过。
同样是小胡子的《Exceptional C++ Style》,虽然涉及面比较窄,不是“大全”类的书,但依然是本好书,也没什么人提,这本和101一样,在09年的今天看来也算是“老书”了。
Bj的新书《Programming -- Principles and Practice Using C++》08年12月出的,也有好几个月了,不过国内似乎还买不到。
再比如《Imperfect C++》也是一本特色鲜明的书,Bj本人对其评价颇高。其他的“新书”还有不少。
另外说几本楼主没提到过的老书,个人认为还是有些价值的,英文书名就不列了,百度中文名很容易查出英文名:
1,《C++程序设计陷阱》,书如其名,拥有大量的语言细节,有一些你可能一辈子都不会接触,被“某些务实者”批评的书。就我个人而言,书的好坏,很大一部分和你怎么去看它有关。
2,《大规模C++程序设计》,一本工程类书,作者拥有数百万行以上大规模软件开发的实践经验,描述了如何进行C++设计,全文中心就是“依赖性”。书比较老,某些观点和技术都显得过时了,有些思想不适合中小型软件,比如编译时间和连接时间,在超大型软件中是很关键的因素,而小型软件开发中国内几乎没人会去考虑它。看这本书要有一定的基础,否则你分不出什么是有价值的,什么是没有价值的。
3,《C++设计新思维》,大名鼎鼎的《MDC》,谈到范型几乎不可避免的要谈到这本书,没有足够的基础别去看,就和阅读Boost、Loki库源代码一样,极容易让人产生挫折感。
4,《C++语言的设计和演化》,作者Bj,一本很容易懂又很难懂的书,说它容易是因为通篇没有过于晦涩艰辛的技术类词汇;说它难懂是因为其思想,书上简单的一句话,你去读,很容易知道他描述的是什么意思,但你要弄懂为什么是这个意思就不容易了。这本书是典型的“每读一遍,都有新感悟”的那种书。
最后,就我个人体会而言,仅靠阅读C++系列的书去学习OO是远远不够的。C++的书提到OO,往往给人比较“散”的感觉,毕竟书的重点是C++,而不是OO。还是建议读一读以OO为中心的书籍。另:个人体会,学学UML其实挺有好处的。
学程序设计,往往有“身在此山中,云深不知处”的感觉,总局限于一个小圈子,到达这个小圈子的顶峰后,突然发现外面还有个更大的圈子,说实话,这感觉不怎么好;但要超脱C++,超脱语言,超脱OO,超脱设计,达到“一览众山小”的境界,我觉得对于单纯的人类个体,几乎是不可能的。
另外,我个人的看法:看书最重要的是弄清楚“为什么”,而不是“怎样做”。
比如几乎所有书上都会说“避免使用全局变量”,那么为什么不要使用全局变量呢?答案有很多,之一是:全局变量会让使用它的各个模块紧密耦合在一起。
那么什么是耦合呢?为什么各个模块紧密耦合在一起就不好呢?耦合是指模块之间拥有相互依赖性,模块之间的紧密耦合会带来理解和维护上的困难,会降低模块的灵活性(易修改性)、易测试性、重用性等。
那么什么是模块,什么是松散耦合,什么是紧密耦合,有没有可以量化耦合度的标准?什么是依赖性,为什么紧密耦合“会带来理解和维护上的困难,会降低模块的灵活性(易修改性)、易测试性、重用性。”,什么是模块的“灵活性(易修改性)、易测试性、重用性”,有没有可以量化这些的标准,你能用代码示例来实际说明吗?你能找到一个很适合使用全局变量的场景吗?
。。。 。。。
空理论其实没什么用,大谈“依赖”、“高内聚,低耦合”等理论,却根本不知道它们是什么,不知道它们怎样体现,不知道如何判断(或者说量化)它们,只知道生搬硬套书上的做法,不去追究其身后的思想,不去联系当前的实际情况,又有什么用呢?
只有当你完整的回答了上面这一系列问题,你才算真正的理解了它,掌握了思想,有了思想,就不会局限于特定的技术;否则只能算“匠”。这一切说起来简单,做起来何其之难。在工程领域,没有经验阅历支撑的理论充其量只能算纸上谈兵,经验阅历只能靠积累,但人生一共才多少年,做个好“匠”都不容易。
[解决办法]
好
[解决办法]
楼主真牛
[解决办法]
好贴
[解决办法]
CPL不是给初学者看的 ,刚开始看C++primer 吧
[解决办法]
楼很高啊 呵呵 学习啦 加油
[解决办法]
刚好需要一辈子的时间,真是终生C++,为C++生,为C++死,生的伟大,死的光荣.
[解决办法]
顶
[解决办法]
大牛啊
[解决办法]
晕了。。mark
[解决办法]
还是经典书籍好啊