天天看点

C/C++学习之路

 有人说c语言已经过时了,学程序设计应该从面向对象语言开始。在这一点上我持保留意见。

1、关于c语言的学习

    在linux下,大部分的程序还是c语言实现的。win32 api仍然是用c语言实现的。

    windows平台c++应用广泛是微软力推的结果,但是现在windows平台应用软件的开发,有向c#偏移的趋势,这要看vista系统推行的效果。到时候,恐怕大家又要跟风似的去学习c#了。作为初学者,不要盲目地去追时髦,到头来吃到苦头的永远是你自己。就像c#,当你刚刚熟悉2.0版本以后,3.0版本已经问世了,又要勿勿忙忙搭上3.0的列车。。。时代在不断进步,技术在不断发展,我们要明白我们真正要学的基础是什么?就像物理学一样,在没有学习经典力学之前,就想学习最新的相对论思想,这可能吗?

不管c++、java、c#怎么发展,不管windows平台青睐于哪种开发语言。c语言仍然是程序设计入门语言的首选。过早的接触面向对象,会让你忽于对计算机底层的了解。没错,编程首先是以人为主,然后才考虑机器.但是,只考虑人,而完全不考虑机器是大错特错的,那会导致你为所欲为,以为自己想到的,计算机就一定可以实现。然而,事实告诉我们,事情并不是我们想的那样.

    在编译器层面上,c++的实现最终仍然会被展开为c形式的,完全没有封装的代码。程序,最终还是要在机器上运行。只有面向对象,而没有c基础,在理解计算机底层技术的时候,还是要回过头来学习c语言的编程思想的。

    美国在使用java等面向对象语言作为入门语言几年之后,现在已经又重新考虑使用c作为入门语言了,原因,正如我前述所说。

    此外,linux倡导的编程艺术是简单美。在今后相当长的时间内,linux平台下的软件开发还是以c为主,当然,不排除kde界面是用的c++,web开发使用java。

    至于编程思想的发展趋势,现在c++积极提倡泛型编程的概念,这与面向对象是完全不同的概念,也是编程思想的一次革新。泛型同面向对象的结合,可以产生良好的效果。java和c#等面向对象语言也跟随其后,提供了对泛型编程的支持。但无疑,c++在泛型编程方面是推进得最好的。

2、c++的学习

    建议学习c++从《c++ primer》等经典外国名著入手,使c++的学习完全不依赖于平台。

    毕竟,c++最先是在unix系统,在贝尔实验室提出来的。只是在windows上得到了发扬光大而已。

    一开始就轻视语言本身的学习,过早陷入mfc类库,会让你不能理解c++语言的真谛,写出的c++代码只能是c式的c++,这也是国内很多c++初学者常走的弯路。

    c++社区的大牛们现在都推荐把c++当作一门全新的语言来学习,完全与c区别开,使程序员不再写c式的c++代码。

    c++发展了二十年,已经不是简单添加了类封装的c语言了。如果你依然这么认为,那么你对c++的认识还停留在上个世纪80年代。

    然而,我在上面又说学习要先打好基础,那不是要从最初的c++思想学起吗?确实,我们应该了解c++的历史,这对于我们理解这门语言非常有用。但并不是要你抱着80年代的c++书籍埋头苦读,而是伴随在moder c++的学习过程当中。c式的c++相对于modern c++有太多的缺点,我们干嘛不学最好的方法呢。就像物理学一样,其中的经典理论也经过了由错到对的过程,那么,我们还要从错误的思想开始学习吗?学习c语言,我们也要从ansi c未出现之前学习吗?当然不是,基础,并不代表就是陈旧的东西。

    但是,在国内,c++标准库的使用并不广泛,很多人对c++的使用依然停留在对c代码的简单类库封装上。这是很可悲的。还好,从2000年开始,大量现代c++名著被引入国内或者翻译为中文版,越来越多的人开始接触modern c++。

国内的c++社区,也涌现出了侯捷、荣耀、刘未鹏等少壮派高手。

还是那句话,学习c++一定要看国外名著,谭浩强、钱能的c++书还是放到一边吧,他们在误人子弟。

    c++大牛们推荐首选使用stl标准库,因为它与平台无关,而且抛弃了c语言中的种种缺陷和陷阱。但是人家没有推荐mfc之类。

    充其量,mfc,现在我只用来做界面框架,因为自己用sdk敲界面框架实在太麻烦了。然而mfc并不是唯一选择,wtl、qt都是不错的界面库。而且,实际上mfc的封装模式早已跟不上c++的步伐,要知道mfc推出时,c++仍未标准化。然而mfc却没有跟着c++的发展不断重构自己的类库,实际上mfc基础架构根本没有什么大的变化。

    而现代c++类库,如stl、atl、wtl、boost、ace、loki等等,都充分结合了泛型和面向对象的优点,是现代c++的完美体现。mfc类库,我承认,其中仍有许多东西值得我们学习。但是针对c++的设计思想来说,他的架构已经过时了,它仍然停留在对c语言的api简单封装的层次上,到处是稀奇古怪的宏代码。这是不值得我们再学习的。

    至于进程和线程等底层处理,则直接使用api,即可以提高运行效率,又对于你认识操作系统很有帮助。

    在代码的整体风格上,应该使用modern c++。在算法和数据处理上,尽量使用stl。只有使用到操作系统api的时候,才使用c语言。当然这其中有个c++代码与c语言api交互的问题,其实很简单,主要发生在vector和string上。

    最后,学习编程关键在于学习思想,不要禁锢于语言的细枝末节上。

    c语言是程序设计的基础,c++的泛型思想可谓是程序设计思想的尖端、潮流。

    在掌握基础之后,学习顶尖的设计思想,就如同轻车熟路一样,非常轻松。

个人观点:

    风格是修养,语法是外功,算法是内功,练好这3种才是真正高手!

继续阅读