学C++是否还有价值?
对这个问题会感到困惑的,也只有那些刚踏入编程大门的初学者。因为对于很多工作多年的老年而言,看到这个问题也只会会心一笑。对于他们而言,无所谓存在是否要学C++的问题。他们所处的环境,所做的业务,已经决定了他们只能使用何种语言。更进一步,那些得道的大侠,语言只不过是他们的工具,信手拈来,他们心中已经没有语言,他就是语言,语言就是他,合而为一,乃为共同体。
开篇之前,先略微声明一下。本文目的不在于为C++辩护或抬举,当然也不会有为此而抬高或打压别的编程语言的意图。所有的,仅仅是有感而发,并且还是从我个人的角度,有所缺失在所难免。如果你是老鸟,其中之缺还望相见一笑;如果你是菜鸟,对于文中的赞美和批评,请擦亮眼睛,别被我忽悠了。
首先我们先要知道一点,C++是一门什么语言?简单点来说,C++是一门接近于全能的语言。为什么说是接近呢?因为C++有一门语言是无法取代的,那就是汇编。再直白点来说,汇编对于寄存器的操作,C++是无法胜任的。不信?你试试用C++来改写一下PC寄存器看看?没辙吧?
"接近"可以理解了,那么"全能"呢?我们知道,C++是兼容C的。不严谨地说,我们可以简单认为C只是C++的一个子集,所以C能做的,C++也能做,这个应该没有人有异议。为了方便,以下所描述的C++,在某些方面也代表C,之所以没采用C/C++这样的写法,仅仅是为了保护键盘而已。转回正题,那C#呢?JAVA呢?它们所能做的,比如网络方面的应用,B/S的方方面面,怎么就没见C++的身影呢?关于这个问题嘛,我们从另一个角度来看,C#和JAVA的运行基础是什么?没错,是虚拟机。虚拟机是用什么写的?嘿嘿,C++。所以,你完全可以用C++先写一个虚拟机,然后再在虚拟机上解释C++语法。是不是很酷?当然,我想现实中是不会有人那么去做的。就像从深圳到上海,你可以坐飞机去,也可以骑自行车去。两者都能到达目的地,但我估计没几个人会选择后者。这就是效率问题。坐飞机,眼一睁一闭,就到了;骑自行车?呃,这时间就不好估计了。所以这领域,该让C#的,或是JAVA的,就让它们去折腾吧。至于C++,就让它干在一旁瞪眼好了,除非你一定想要耍耍酷。
接着,我们就来看看桌面应用吧。所谓的桌面应用,我们狭义一点,就是桌面应用程序。总的来说,目前在这领域,C++确实还能占有一席之地。但这仅有的一席之地,也岌岌可危。在XP之前,因为系统都是没有预装.net framework,所以C++的对手无非就是VB和DELPHI,但这两者根本无法撼动C++这颗大树。虽然XP也能装.net framework,但为了一个应用而弄一个体积如此巨大的玩意,却有那么一点点的不现实。但后XP时代,世界就不一样了。Vista已经预装了.net framework,更不用说Windows 7。甚至还有传言,Windows 7的用户界面就是用C#搞定的。何况,C#还有杀手锏,能和Silverlight完美结合,大大减轻UI的开发难度。看起来,在今后的日子,在这个桌面应用领域,C++日子过得并不舒坦。在这领域,可能C++还能耀武扬威的,也许就剩下大型的3D游戏了。虽然用.net配合OpenGL或Direct3D也能做C++的事,但效率却会大打折扣。虽然随着硬件的不断提升,可能这折扣会不断缩小,但毕竟还是存在的。只要折扣存在,那些游戏厂商就不会放弃C++,因为能优化,为何不优化?但,也许也仅仅限于此了。C++,它泪流满面。
最后呢,就是嵌入式领域。在这里,是C++的天下,C++是永远的王者。它不是一个人在战斗!此刻,它灵魂附体!你见过那些RTOS是用C++以外的语言写的(再次重申,正如前文所说,这里的C++也代表了C)?至少我印象中没有。嵌入式linux支持.net?除非微软的脑袋秀逗了。也许有人说,WinCE不是可以支持.net么?支持是可以支持,但并不代表所有的WinCE设备都支持。因为WinCE是可裁剪的操作系统,也许是为了节约内存空间,也许是为了启动速度,或是由于别的杂七杂八的,甚至莫名其妙的理由,很多厂商根本就不会将.net这个会将系统膨胀至少4M的组件加到产品去。看看WinCE的内核代码,看看WinCE的BSP包,哪里有.net代码的身影?全部清一色的C++。甚至于WinCE的应用程序,微软的态度也非常明确,在桌面只能.net使用的Silverlight,在WinCE SP3添加之后,却是更改为了C++接口。王者,绝对的王者,根本就不可能有别的语言在这里将C++撼动!此时,C++站起来了!腰板直了!
说了那么多,那么我们的最后,就来看看为什么大家都说学好C++难吧。如果你对学好C++没啥兴趣,以下的文字估计对你也没啥营养,你可以完全忽略不计,可以很愉快或很气愤地将当前网页给咔嚓掉。
其实学C++很简单,但难就难在这个"好"字。初学者会发现,入门很简单,因为C++也没啥语法;但搞清楚语法后,接下来就犯糊涂了,下一步应该怎么走呢?只所以产生这种原因,是因为C++太灵活了。对于一种功能,C++有各种各样的方法,究竟什么方法才是最合适的?比如说,传递给函数的形参,什么时候该使用指针,什么时候该使用引用?就连平常得再也不能平常的指针转型,有C的括号形式,还有C++特有的dynamic_cast和reinterpret_cast,究竟哪个才是该使用的?更不用说分配内存了,既有malloc,还有new,如果算上STL的话,还有一个resize。我想所有的这些,对于初学者而言,如果他看着这些能够腿不痛腰不酸,那么我强烈佩服这人的淡定力。
C++还有更让初学者郁闷的是,即使不用STL,不用类,不用虚拟继承,甚至不用C++的一切特性,也是能够完成所相应的功能。所以,疑惑了,C++是什么?也许这时候,很多人就会想,如果选择是唯一的,那是多么地幸福啊!因此,很多人就转向了C#(或别的语言),因为对于某些操作,方法是唯一的;即使不是唯一,也没有C++那么繁多。
没打算在这论述该如何学习C++,因为一千个人有一千种方法,而这一千种方法,还不一定适合你。但有一点是共通的,那就是多看书。将市面上经典的C++著作,仔仔细细地消化,相信一定能达到炉火纯青的地步。即使达不到吧,也没事,不会作诗也会呤吧?只是,这时候意志力就非常重要,当然也需要那么一点点情商,要相信没有迈不过的坎。
最后的最后,以一句来结尾:C++有风险,入行需谨慎。