如何学习 C++
如何学习一门较复杂的编程语言
前言
呵呵,大家好,我又来了,其实我天天在,大多数时候总是回答一些套话,比如"同意上传。文件名:......文件夹:......",或者"确认完毕,加1分,谢谢支持"之类,大概传过书的朋友都见过吧。
前几天,心血来潮,写了一篇如何选书的帖子,写完以后,手痒难忍,不知哪条虫又醒了过来,趁热再来一篇,谈谈如何学习 C++,总题为"斑竹观点",不知道以后还会写什么,也许就这两篇打住,也许会洋洋洒洒写成系列(吹牛不上税吧?税务局别来我呀),那就要看我有没有心情和那么多闲工夫了,至于别人想不想看,爱不爱看,我可管不了,自己痛快就行啦。你自己愿意恶心自己,就往下看,哈哈......
闲话少叙,书归正传。话说在很久很久以前,C++ 红红火火,风头正劲,天下多少英雄豪杰为其......
(呸,废话连篇,看西红柿......)哇,不好,我躲,我躲,我躲躲躲......
惨,掌声没有,烂西红柿来了一筐,等我去换身衣服先......
......西服换成马褂,咱接着来。睡觉的醒一醒啦,快看呀,窗户外面下刀子了!
自从 Java 问世以来,C++ 阵营人气日下,唉,人的本性就是喜新厌旧,最近又新出一小妞,叫什么 C# 的,搅得人心惶惶,明明是 Java 的克隆加变异,她干妈(那个叫什么 M$ 的)非要和人家 C++ 攀亲戚,说是 C++ 亲生,和 Java 对着干。唉,这世道,乱套了,不知道这人心都是怎么长的。
我不怕你们的西红柿了,我准备了纸糊盾牌,嘿嘿,除非本·拉登亲自出马......
但是,C++ 周围总还是有一誓死效忠的追随者长伴左右,任你风吹雨打,我自岿然不动。C++ 把纯粹与高效,精美与诡异完美地,近乎奇迹般地集于一身,吸引着那些喜欢寻幽揽胜的探险家们。当然 C++ 并非不实用,但我今天不想谈 C++ 的工业应用(那是我的工作,俗),超脱起来,来看看纯粹的 C++。如果你想为了工作而学习 C++,我劝你就此打住,别往下看了,我帮不了你,瞎耽误工夫,我也劝你别学 C++,改行 Java 吧,或者 VB 也成。如果你是一个专职程序员,下一个项目是关于 C++ 的,而你还不会,想临时抱抱佛脚,你也别看了,我想你的公司会组织你们集体去抱的,你们可以针对你们的项目学习一个够用的子集大概就可以了。我这篇帖子不是佛脚,不讲如何速成,我只是想针对现在众多想学习 C++ 却又无从下手的学生提出我自己的建议。你可以不同意我的观点,那么请准备好西红柿,等我讲完了,我给你们时间扔(事先声明,我要好的,烂的不要啊)。
好了
,如果你的耐心已经让你忍耐至此,而且还想忍耐下去的话,我希望你能忍到最后,再也没一句废话了,你没有理由看完上面的废话不往下看。
一、什么是 C++?
一看我的标题,大概又有人举西红柿了,您慢着点儿,别闪了腰或岔了气!很多人不知道这个问题的正确答案。如果你还认为"C++ 是 C 的超集",那你可是大大落伍了,这是二十年前的答案了。如果你说"C++ 是一种面向对象的程序设计语言",哈哈,沾边,但也不对,在98年 C++ 国际标准公布以后尤其不对!
C++ 之父 Bjarne Stroustrup 曾有一篇论文 Learning Standard C++ as a New Language,《程序员》杂志2001年4月号有陈崴的译文《将标准 C++ 视为一个新语言》,把 C++ 和它那个好像还不是右派的爹彻底划清了界限。文章对 C 和 C++ 在 Complexity(复杂度)和 Efficiency(效率)两方面做了比较,指出 C++ 已经完全不同于 C 的观念,并对如何学习标准 C++ 提出建议。有兴趣的朋友可以看看,很有启发性。
C++ 发展至今,其历史已足够写一本书了,Bjarne 的经典名著 The Design and Evolution of C++,详细记述了 C++ 设计和发展过程中(1979-1994)的种种考虑与妥协,它不讲 C++ 是什么样的,它只讲 C++ 为什么会成为这样。不建议初学者去看这本书,实在是咬不动,我当初已经看得头破血流了,
而且这本书只讲到1994年为止,多少有些过时了,如果你已比较好地掌握 C++,并想了解其历史,看看倒是有些参考价值。
C++ 虽然起源于 C,语法也比较相似,其迅速成功并成为主流很大程度上也归功于 C 的成功。但经过多年的发展,其最精妙,最有吸引力的部分正是不同于 C 的那一部分。Koenig & Moo 夫妇在为想成为更好的 C++ 程序员的人提出的3条建议中第1条就是"避免使用指针",你相信吗?指针正是 C 的核心呀。C 的宏、位运算、结构、联合、数组、强制类型转换、指针,在 C++ 程序中都应该尽量避免(在少量涉及底层的程序设计中例外),C++ 语法上强调的是类、对象、模板、标准库、引用、异常和 const 关键字,思想上强调的是面向对象和泛型。
在 Procedural Programming, Object-Based Programming, Object-Oriented Programming, Generic Programming 中,C 仅仅支持第一种,而就是在 Procedural Programming 的程序中,如果使用了标准库,一个 C++ 程序也可以和实现同样功能的 C 程序完全不同。
Bjarne 曾不止一次强调 C++ 不仅仅是一种 Object-Oriented Programming Language,那是 Java,C++ 是一种集各种编程风格于一身的程序设计语言,Object-Oriented Programming 只是其中一种,并不比其它几种风格重要。我目前很怀疑 C++ 对面向对象的支持程度,虽然它一度在这方面风光
无限,但多年发展,它并没有形成一个类似于 Java 或 Python 或其它语言那样的类库,也很少取得成
功的像样的类库(不能说一个没有,但毕竟很少),反而,在难产到1998年的 C++ 的第一个标准化文本中的库却是基于 Template 和 Generic 的。哈,这多少有些讽刺意味,在别的语言还唧唧喳喳讨好面向对象的时候,C++ 抛下一个媚眼,却转身投入泛型的怀抱。见风使舵的 Java 和 C# 好像上错了贼船,又都赶着往自己身上贴泛型的金,弄得人不人鬼不鬼,当初,Java 可是批判 C++ 过于复杂最起劲的一个,在可以预见的将来,它的复杂程度将不低于 C++。拜托,有点创意好不好,别总让人神经衰弱了!
Java fans 们不要扁我,下次我写"如何学习 Java"时,咱哥们友情后补。
废话太多,第一个问题就此打住。
二、选用什么样的编译器?
这个问题也是初学者经常问的问题,其实一句话,对于初学者来说,现有的较新的编译器,除了易用性外,没有任何区别。
有人总是在用 VC 还是 BCB 还是 GCC 上争论不休,我想如果你能把这三种编译器的区别用出来,你现在就不会看我这篇破玩意儿了。但有人现在还在用 Turbo C++ 3.0/3.1,如果你真想学好 C++,我劝你还是换换的好,那东东确实是个好东东,但已经被 Borland fans 们当作古董收藏起来了(我也留着一套呢,还有 TC 2.0),你也收起来吧,没准什么时候能卖个好价钱。
我要讲的一个重要问题是不要把 VC 与 C++ 混为一谈,也不要把 VC 当作另一种语言。首先,VC 的全称是 Microsoft Visual C++,注意,前面带有公司的名字,即使是 Java,也没有叫过 Sun Java,这就意味着 VC 是一个产品,它是 C++ 众多编译环境中的一种,它不仅仅带有一个 C++ 语言的编译器,它还带有一个用于开发 Windows 应用程序的 Application Framework - Microsoft Foundation Classes Library (MFC),又一个带公司名的家伙,它只是用 C++ 语言在 Windows API 外面加了一层包装而已,省得赤裸裸的,让程序员们在工作的时候总走神去看那些不该看的地方, 这个东西多少让开发 Windows 程序变得更容易一些。呵呵,不要再把 VC 当作语言了。
在易用性层面上,我还是推荐初学者使用 VC,用这个东东的比较多,遇到问题也好人问。至于版本,6.0 应该够用,但这个版本已经是5年前的东东了,毕竟早了些,与标准的兼容性也多有诟病,如果有条件的话,可以用 VC .NET,这个东东的最新版本是刚刚发布的2003版,我还没见过,我只用过它的上一个版本。经过 C++ 大腕 Lippman 亲手调教过的2003版,据说对标准的兼容性已经有了根本性的转变,管他呢,又是一个宣传用语,只要你不是特意去
实验标准中的那些犄角旮旯,现在流行的编译器都已经绝对够用了。
三、选书很重要
这是一个最让人挠头的问题,选什么书总是见仁见智,什么书最好是一个永远不到标准答案的难题,
来我们这个论坛的朋友多半是冲着书来的。我不想评论哪本书好哪本不好,我只是大致列一个书单,简单讲两句。
我的书单并不定位于一个没有任何语言编程基础的初学者,我觉得这样的初学者不适合直接学习 C++ 语言。我的书单定位于那些有其它语言的一定的编程基础的 C++ 初学者,他至少应该知道什么是变量,什么是运算符,什么是表达式,关键字,语句,程序,至少应该知道赋值语句是干什么的,分支判断语句干什么,循环语句干什么,当然他不必知道 C/C++ 的词法和语法,也就是说他有以上的概念,但不知道这些东西在 C/C++ 中是如何实现的。在这个基础上,我把书单分为入门类、进阶类、应用技巧类。
入门类:
C++ Primer, 3rd Edition
Thinking in C++, 2nd Edition
C++ 大学教程(这本书我没看过,但不少初学者说不错,留此存目)
The C++ Standard Library: A Tutorial and Reference
进阶类:
The C++ Programming Language, Special Edition
The Design and Evolution of C++
Inside C++ Object Model
C++ Templates: The Complete Guide
STL 源码剖析
Generic Programming and the STL
Modern C++ Design: Generic Programming and Design Patterns Applied
学编程学什么语言更好应用技巧类:
Effective C++, 2nd Editon
More Effective C++
Exceptional C++
More Exceptional C++
Effective STL
Ruminations on C++
对这个书单我有几点说明:
1、除我注明的那本以外,其它书我基本看过,或浏览过,了解其大致内容。也因此这些书就局限在我的眼光之内,既然不愿给大家推荐我没看过的书,也就难免有遗珠之憾。
2、很多人认为 The C++ Programming Language 是入门书,我认为不妥,这本书号称"专家自学指南",并非浪得虚名,读者水平越高越能从这本书里学到更多的东西。如果身边没有一个很好的老师随时指导的话,我不建议初学者选用这本书,一上来就看这本书容易产生挫折感,影响学习的信心。这本书也可以作为语言参考手册常备身边,随用随查。
3、入门类前三本选一本即可,第一本我详细读过,第二本我大致浏览过,第三本没看过。第四本我极力推荐,每个初学者都应该好好看看,很多人认为应该归入进阶类,我放在入门类自有我的道理。有网友反应 Thinking in C++ 对于初学者太难,我感觉如果符合了我上面对初学者的初步要求的话,读这本书应该没什么问题。
4、我不建议用国内的书入门,我见过大部分国内书的内容只
是讲了一个更好的 C,不是 C++。我认为初学者应选择一本对语言介绍比较全面、详细的书,以便对 C++ 有一个全面而系统的认识,一知半解是学习的大忌。如果一本自称全面的 C++ 书中缺少 String, Containers, Generic Algorithms, Namespaces, Templates, Exception Handling, RTTI 中的一个,你有理由不看它,如果一本自称全面的 C++ 书没有讲到标准库或 STL,你有理由不看它,如果一本自称全面的 C++ 书中的头文件还带有 ".h" 后缀,你有理由不看它。
5、应用技巧类并非最后再看,我单独把这些书列出,是因为这些书要和前两类书一起看,没有先后顺序。
6、选书的原则以及与每一阶段学习的关系,到下一部分我还要继续展开。
7、上述大部分书都有中文版,翻译质量大部分还不错,建议英文较好的最好直接读英文版,英文不好的也可看中文版。
下面我谈谈对纸版书和电子版书的看法。初学时最好去买一本纸版书,这样无论你躺着,坐着还是站着,也无论你身在何处——教室、图书馆、实验室、湖边长廊,你都可以很方便地拿出来看。很多同学的实验室和寝室中都配有电脑,似乎看电子版很方便,但是当寝室中老大在大呼小叫地打 CS,老二
抱着电话和准老婆谈情说爱,老三抱着枕头说着梦话,老四抱着吉他唱着调跑到北冰洋去的自创情歌时,无论你是老几,我不相信你能对着电脑屏幕,心平气和地看着 C++ Primer 电子版,寝室根本不是学习的地方,最好还是拿上一本纸版书,到自习室、图书馆去吧。
课间短剧
讲到此处,digerati 同学举手发言:"老师,我有笔记本电脑啦,我可以带到自习室去,还是看电子版。"
涅槃老师当场被噎出四个跟头,晕了过去。五分钟后悠悠醒转,感觉口干舌燥。"水......水......"
涅槃老师喝了两口水,清清嗓子,继续讲课:
刚才,digerati 同学说得......说得......很好......是吧......哈哈......这个......那个......是呀......啊......
你可以把笔记本电脑带到自习室去,但你在马路边等 MM 或者 GG 的时候,或者坐公共汽车的时候,笔记本电脑总是不如纸书方便嘛?是吧?
zhazha 同学举手发言:"老师,我有掌上电脑啦,比你那本两块砖头重的书方便多了,我可以在等 MM 的时候看电子版。"
涅槃老师当场被噎了八个跟头,一天都没有醒。
转天,涅槃老师才醒过来,有气无力地抬起胳膊,伸出手:"眼镜......给我眼镜......"
zhazha:"老师,您戴着呢。"
涅槃老师:"那我怎么什么都看不见啊?"
zhazha:"您还没睁眼呢!"
涅槃老师艰难地睁开眼睛:"怎么还看不见呢?"
zhazha:"老师,您睡了一整天了,揉揉眼睛。"
涅槃老师

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。