C++ 的“武”和“功”

来源:互联网 发布:店宝宝是什么软件 编辑:程序博客网 时间:2024/04/29 05:25


练武不练功,到老一场空。

练功不练武,十年白辛苦。

 

这是我当年看电视剧:《霍元甲》时听到一句话。“功”是指身体素质、内力、“武”是指招式、套路、章法。

练武不练功,是指光有一些招式华丽,基本功却不行,一推就倒,所以到老一场空。

练功不练武是另外一种情况,苦练一身肌肉,体内真气盈溢,差不多就是金刚不坏之身了,可惜手上招式一点不会,拿刀不会砍,拿枪不会刺。记得当初郭靖身体素质很好,但他于降龙十掌中只学会了一招“亢龙有悔”时,出手就来这一招,搞到自己累得要吐血,对手还莫名其妙(我跟你有血海深仇吗?)。修行十年,内力深厚,却打不过人家,所以叫“十年白辛苦”。

 

学习编程,比如学习C++,确有不少人,要么光练武,要么光练功。比如有人说他会C++。一问,才知道是会VC;再一问,才知道会MFC,好吧,虽然Bjarne Stroustrup一提到MFC就皱眉头,那你注册个窗口类吧,这人说,我只会用VC的向导生成一个窗口。再比如,有人说他有3年的C++使用经验,于是问他下面两个函数是否构成重载:

Code:
  1. void foo(int );  
  2.   
  3. enum Week {...};  
  4.   
  5. void foo(Week ); 

 很干脆地回答他从来没用过枚举,还加了一句:“enum 有用吗?人家java语言刚开始时,就故意抛弃了它。”我想说后来java 1.5不又加上了enum?再一想讨论这个没意义,就问他:“那你总得有个办法来产生一个可读的符号,比如宏啊,常量啊?”。他说“直接用字符串多好啊~”,刷刷地来了一段:

Code:
  1. string fruit"Apple";  
  2.   
  3. //...  
  4.   
  5. if ( fruit == "Apple")  
  6. {  
  7.   
  8. }  
  9. else if (fruit == "Pear")  
  10. {  
  11. }  
  12. else if (fruit == "Peach")  
  13. {  
  14. }  

“有什么可读性问题吗?”他问我,“而且,需要时,还可以直接把它输出到屏幕,很方便调试呢!”。(如果他要问我:你是怎么输出一个枚举值呢? 哎哎,我会惭愧得不好意思说,自己一直都要为特定的enum类型,临时写个 operator << 的重载。 )

 

说到字符串,又想起另一个实例。有个类库,它提供一个链表接口类:IList。只是接口类,存不了什么具体的元素。如果要想存放整数,就自己实现一个IntegerList吧,如果想存放学生信息,那该是“StudentList”。不过考虑到“字符串链表”太经常用了,所以类库已经实现了一个“StringList”。在这里面,懂得如何使用StringList,算是一种“武”,而懂得如何规划所需的派生类,那算一种“功”。但有个光爱练武者,他觉得,既然手头已经有一个“StringList”了,还何苦去写其它List呢?不管是Integer,还是Student,反正他通通先拼成字符串存入,需要时再取出来,拆分、转换回来。我批评他,他回我一句,这种“以不变应万变”的最高境界,你是不懂的。隔数天,我在一个评论C#的“装箱/拆箱”的贴子上,我看到他积极的身影,正在义愤填膺地痛诉万恶的box机制是如何如何的低效率。:) 真是一个可爱的哥们。

 

《白话C++》课程中提到,编程语言的发展,从朝着“机器友好”向“人类友好”的方向发展。在此发展过程中,无论从哪方面看,C语言(而非C++或更后来的语言)都是最成功的语言,其中一个方面就是,C在给程序员一个直观的“语言界面”的同时,它依然直接地对应了机器结构。仅管计算机的运算速度在变得越来越快,但它的结构却没有根本性的变化,还是冯·诺依曼结构。所以很多国外IT教育者认为程序设计专业的学生,必须从C语言学起。

这就是我想说的第一种“功”:了解机器。我们在PC上写程序,而不是在床上写程序,所以最好我们还是应该对PC的结构有所了解。再接下来,如果我们是在图形用户界面上写程序(GUI),那至少该了解一下最常用操作系统 Windows。包括消息机制、GDI资源、内存管理、进程间通讯。别因为它是M$的产品就鄙视人家,因为天下GUI一大抄呢。如果是在Linux下进行GUI编程,同样是这些:消息、GDI、内存、进程通讯……哪个差得了? 这是我们说的第二种“功”:了解操作系统。如果你还只是初学者,那直接面对这两样是有些难,那最后一样“功”,C++语言本身,你总得练好了,在我看来,这可是“童子功”,在你思想最单纯,在你还不需要养家糊口的时候,练好它吧。

 

接下来说另一个极端了,那就是“练功不练武”的问题。哎呀,相比“光练武”的通常都头头是道,振振有词;换到这个方向上,苦大仇深的人,自动找上门的人可就多了!

“老师啊,我整本《C++ Primer》,都学了啊,可我始终只会往一个黑黑的窗口上打印一些字符……我会循环,会条件分支;我理解抽象、理解封装与多态;我拧得清重载和覆盖、拧得清is a和has a,拧得清公有派生和私有派生……对为什么类模板可以特化而函数模板不可以之类的问题,我已经从语言根底上了解它的来龙去脉……可是,为什么还是什么也不会,我想要的,什么也写不出来?”

 

是啊,我知道你要什么!

你不过是想透过网络,调用一下google或yahoo提供某个提供天气预报的Web Service接口。

你不过是想把公司财务软件导出来的某个有着严格xsd定义的,XML格式的报表,拿来解析一下。

你不过是想把深夜下载的一些小说,压缩一下,再加密一下。

你不过是想在Windows的桌面上,骄傲地运行一个自己写的小程序,用来定时或不定时地提醒你:该站起来扭扭腰了啦;

你不过是想在玩别人游戏玩累的时候,动手写个俄罗斯方块自己爽YY一下自己;

你不过是发现自己每天的工作都是固定地往公司规定的Excell文档里填写一些有点规律的数字,所以你想自己写个程序来操纵Excell。

你不过是想在市里精神文明办在网上评先进小区时,帮助街道大妈大爷想个法子,试试能不能作弊,让程序自动“点击”投票。

你不过是想为你当教师的老妈妈,写个成绩管理程序,不过是想访问一下数据库,读点数据,写点数据,统计点数据。

你不过是想写个有点灰色的程序,假装自己是传说中黑客,很友情地吓一吓网络上的某个MM

你不过是想玩下Linux下,到那里面也写一个有窗口的,有个按钮的程序,最好按一下那个按钮,还会弹出一个消息框,上面写着“Hello Linux.”相当于Linus的世界里,留下一个“到此一游”。

你只不过是想用C++语言写一个多线程的例子,试试如何用多线程抢带宽。

……

这一切,《C++ Primer》都没有教啊。因为,《C++ Primer是用来教你如何练童子功的啊。它不教你具体的一招一式。你想再进阶看C++之父写的《TCPL》,那是另外一本练功书,它们负责教你金刚不坏之身,至于那些使用C++打造出的其它十八般武器,如何个玩法,它们不教。

怎么办?来上我的课呗!等着捧场一下我写了足足8年的书:《白话 C++》。

得先说一下,我们可能真正打了非常好的“功”以后,才开始学习“武”吗?

当然不可能,也完全不应该,想要成为恋爱专家,却坚持不和女人上床,我以为那只能培养出某一流派的哲学家。想要成为武林高手,却花了50年光用来练马步,真是相当不可取。练一阵子功,再习一阵子武,习一阵子武,再回头练更高层次的功,比较现实,并且肯定可以相互促进,相得益彰。

我会用直白的方式,深入地讲解一些基础知识。比如,有些人,一知半解,看到下面的测试代码时,一下子“心神不宁”的:

Code:
  1. if (0.5 == 0.5)  
  2. {  
  3.    cout << "yes" << endl;  
  4. }  
  5. else  
  6. {  
  7.     cout << "no" << endl;  
  8. }  

  他们说:“好像,好像浮点数不能直接比较啊”。这类人,就是对“基本功”不太扎实的,只知道浮点数不好直接判断相等却忘了这世界上,是先有浮点数,然后才有计算机。

  我还会告诉你:既然有了if/else时,为什么还要有swith/case,还是和浮点数有关啊!

  我不会直接教你面向对象,相反,我会让你爱上一个女人一样,爱上“面向过程”,然后厌烦了“她”,终于你遇见了另一个她:“面向对象”。和爱与不爱一个女人之间的相同的地方是,这都是你的需求;而不同的是,你通常是因为感情或肉体爱上另一个女人,但我要你因为理智而爱上面向对象。

   这些都是“功”,“武”呢? 我会讲STL里vector,list那么纯粹的东西,但我也会讲boost::thread。谁说C++里没有跨平台的线程来的!我还会讲wxWidgets,它是通行于多个平台(win, linux, mac)下的图形用户界面库,完全的C++代码,虽然它被用于ruby,python,甚至java等语言...我还讲xerces-c,这一套强大的XML库。想要把一个有着xsd限定的XML文档,与C++的struct数据直接产生映射,别以为只有C#做得了噢!想要拿到一个wsdl就可以直接透过网络访问远在地球另一端的WebService呢?gSOAP帮你搞定一切,兼容性之高,java等语言无法望其项背。想要写一个有着不错的显示性能,并且能跨平台的游戏?我留了一点点章节讲解SDL,如果你等不及,为什么现在上YouTube搜索一下关键“SDL”呢?

 

   上我的网站:www.d2school.com看看已经发表的课程,我忘了说一点,学习C++和学习其它语言,最大的不同,就是:“耐心和细心”。先按《准备》章节的课程,好好准备那些库的安装吧。
 

   最后,是不是等着买一本《白话 C++》就够了?当然不是,我不想找骂。从我开始接触C++,这15年我个人在编程书籍花的钱,没有上万,也得有7,8千元----你肯定不用买这么多书,因为当初没人教我如何学习C++,自然没有教我该买哪些书。我走了很多弯路,花了很多冤枉钱,不应该让新同志重犯。前面说的《C++ Primer》还有TCPL都是强烈推荐您买的。再有的,我的书的最后一章它会开出不少书籍,不仅仅是C++的,还有操作系统相关的,数据库相关的……

 

   好了,这就是我的第一篇笔记。老王卖瓜自卖自夸是难免的。但此时,在此处,我一个学生也没有,急嘛,眼红嘛,贴个招生启事不违法吧?人家电视购物上,候总叫得比我好多了。

 

-------------------------------------

如果您想与我交流,请点击如下链接成为我的好友:


http://student.csdn.net/invite.php?u=112600&c=f635b3cf130f350c