现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

如何学好C++语言

2012-03-27 13:39 工业·编程 ⁄ 共 1963字 ⁄ 字号 评论 13 条

    昨天写了一篇如何学好C语言,就有人回复问我如何学好C++,所以,我把我个人的一些学习经验写在这里,希望对大家有用。首先,因为如何学好C语言中谈到了算法和系统,所以这里就只谈C++语言。

  • C++是最难的语言。这个世界上最难的编程语言可能非C++莫属了。你千万不要以为几天就可以学好C++,C++的学习曲线是相当BT的,你可以看看这篇文章。C++是一门很自由的语言,自由到了有点BT和恐怖的地步。我甚至认为C++并不是一门成熟的编程语言,因为太容易犯错了。所以,你一定要在一开始就要有很小心谨慎的态度,并把C++当成一种难以训服的猛兽来看待
  • 多问“为什么要这样”的问题。学习C++一定要多问几个“为什么是这样”,“凭什么要这样”的问题。比如:很多人知道C++有拷贝构造函数和初始化列表,但你真的知道为什么要有拷贝构造函数?为什么要有初始化列表吗?为什么要有template,为什么要有 RTTI,为什么不是别的呢?难道就是为了让一门语言变得Cool一些吗?完全不是这样的,C++中的任何一个feature都有些实实在在的原因,你一定要去了解为什么要把C++设计成这样的原因,你才能学好C++。有空看看《C++演化和设计》一书。
  • 看书,大量的C++书。你可以按如下先后顺序阅读(下面这些书,我花了大约4-5年的时间,今天我还在随时温习)
    • C++ Primer》,这本初级读本可能让会你啃得很痛苦,所有的语言的特性和为什么都在里面了,好好读读。当然由C++之父写的《C++程序设计语言》也不错。两本看一本就好了(我看的是前者)。
    • 了解C++的语法仅仅是万里长征的第一步,你还需要看看《Effective C++》和《More Effective C++》这两本书并不厚,但我从02年就一直看到现在,每次读我都有新的体会,这两本书太经典了。如果你对C语言不熟,这两本书会让你回去补C语言的课。
    • Think in C++同样是另一本经典之极的书,学c++必读,但是中文版的翻译的很不好,所以还是去读英文版的吧。
    • C++沉思录》同样非常值得一读,这里教的不是编程,而是思考的方法,这是相当珍贵的。
    • Exceptional C++》和《More Exceptional C++》让你看看各种问题的解决方法和一些常见的经典错误。
    • Advanced C++》和《Modern C++》可以让你知道C++各种神奇的用法。
    • 泛型编程与STL》是把C++实践到了极致的东西。很强大。STL——神一样的模板库(容器,算法和函数对象),不得不服。
    • 深入探索C++对象模型》让你了解编译器下的C++是什么样的,让你了解C++的性能并不差。这个对于C++的程序员太关键了。我以前写过的《C++虚函数表解析》还有《C++对象内存布局》属于这个范畴。
  • 和Java语言做对比。我个人以为Java对C++这个并不成熟的语言做了很多调整,规范和限制。所以,对比一下Java和C++,想一想,为什么一些东西在C++中可以做,但在Java中却不行。比如:Java的异常是必需要catch的,不然就会编译不通过。为什么Java不提供操作符重载?为什么Java会引入接口来做多重继承?为什么Java没有像C++那样的I/O字符流?为什么Java不支持指针?为什么Java可以做到垃圾回收?等等。Java体现着很多面向对象设计的东西,学习Java有助于你学会怎么更好地使用C++来编程
  • 面向对象设计 。虽然面向对象可能是个骗局。但是我觉得面向对象设计中的一些实践非常的不错,比如,单一原则,依赖倒置原则,等等,都非常地经典。《设计模式》必需一读,《面向对象的分析和设计》可以一读。但不可以设计模式为中心来编程,而应该是用设计模式来解藕
  • 类库学习。看看MFC是怎么封装Windows API的,看看ACE是怎么面向对象的,看看boost是怎么玩面向对象的,看看CPPUnit又是怎么设计的。当然,Java的JDK中有太多的设计模式,可以参考。

希望没有吓到大家,并欢迎大家补充。

—————更新 2011/03/30 19:20————

更新几个观点:

  • 1)我不擅长写书评,所以推荐的这些书可能会让你有点看点没有感觉,你可以上豆瓣或是China-pub上看看书评。
  • 2)C++有很多奇淫技巧,有的很BT,包括虚函数表,也许会有人觉得有点没意思,但我觉得很有意思,一方面可以了解一门语言的实现细节,另一方面可以开阔思路。我从学习这些知识中受益很多。
  • 3)上述是我的个人的学习历程,我觉得对我很有效,所以是经验之谈。
  • 4)这类的文章在网上有很多很多,我不是第一个写这样的文章,我也不是写得最好的,我并不希望用长篇大论来谈论什么。只是想给大家了解一下大概的学习样子。毕竟,C++博大精深,任何一篇文章都无法说好。不如就简单一些。

作者:陈浩

目前有 13 条留言    访客:10 条, 博主:0 条 ,引用: 3 条

  1. 爱求索 2012年04月14日 10:59 下午  @回复  Δ1楼 回复

    入门,《C++ Primer》、《Essential C++》足以。进阶,Effective

    C++系列、Exceptional C++系列、google C++编程规范(或者俺写的那本150个建议),同时研究一下

    STL源码。如果再提高,那就是《Thinking in C++》/《C++编程思想》、《The Design and Evolution

    of C++》、《Inside The C++ Object Model》这几本天书了。

  2. 爱求索 2012年04月14日 11:00 下午  @回复  Δ2楼 回复

    如果是客户端的应用开发,win首选;如果服务器,那就Linux了。在不同的操作系统下学C++,最主要的不同就是开发环境IDE

  3. 爱求索 2012年04月25日 11:29 下午  @回复  Δ3楼 回复

    1. 死记硬背 (相关类)
    2. 多写代码 (应用类)
    3. 多改代码 (自作类)

  4. 爱求索 2012年04月25日 11:48 下午  @回复  Δ4楼 回复

    重点就是吃透C++类,属性,方法的实现,封装,然后强行记住MFC的框架。

  5. 爱求索 2012年04月27日 11:47 下午  @回复  Δ5楼 回复

    1、查资料的顺序 C++ Primer -> The C++ Programming Language(就是C++发明人写的那书) -> ISO C++标准(98和2003都是正式版, C++0x的是草案,还没完成投票)

    2、C++ primer一点都不深,真的,不要迷信外行的话。 然后就是,除非你时间特多,不建议从头到尾看这种厚书,我遇到好几个声称看完1 到2遍此书的新人来,结果随便问几个要点,都说忘了。。。。 还是要做实际项目,有了问题,再来查书比较好。

    3、第2点里写的查资料顺序是我个人经验, 一般如果你的问题都能在C++ Primer里面找到答案,那你差不多还在初级程序员的范围; 如果在The C++ Programming Language 里面都能找到答案,那也只是一般的 高级程序员; 如果很多问题,你不得不看C++标准了,以及经常去comp.lang.c++新闻组了,那你就是准大师级别了(一般人都达不到,也不一定需要研究这种程度)

  6. 爱求索 2012年06月07日 11:00 下午  @回复  Δ6楼 回复

    现在的编程是越来越简单了,不需要知道详细原理和算法,相应的算法都给封装好了,只需要调用就行了,就象当年的傻爪相机出来后一样的.
    所以现在的编程多数并不能体现编程水平,只能说是是对一个软件的熟悉程序和使用水平,不能代表设计水平.只有自己实现的算法才能体现水平.
    同样,现在的技术使用上也方便了,只要懂点就可以干出来,因为关键的实现都替你实现了并提供接口,但你要让他自己从头干,他是绝对干不出来的,虽然他可能说出一套一套的原理,可这些原理从网上都能查到的,就象火箭原理大数人都知道,可能干出火箭的国家有几个.
    所以,象多线程,网络编程等其实并不难,难得是如何编出高质量的程序:程序稳定,实时响应好,处理速度快.这些就不是大多数会用几个控件,会实现几个功能程序的人能解决的能办到的,但现在计算机性能是越来越好,因此表面上一般是看不出来的,只有处理大量数据时才能看出来.
    要想编现高质量的程序,基础知识非常重要,任何时候都不能扔下,要时不时看看专业知识,每看一次我想都会有不同的感受,因为现在是在有了工作经验的情况下看的,不是象在学校里单纯学理论时被动的学基础知识的.

  7. 爱求索 2012年06月07日 11:02 下午  @回复  Δ7楼 回复

    个人认为程序员的基本标准(不绝对):

    1)至少同时熟练掌握以下语言:
    计算机基础工业语言之中的一种:汇编或者C。
    计算机桌面级应用语言的一种:C++
    计算机企业级应用语言的一种:C#或者Java
    脚本语言的一种: Python或者Perl
    一种WEB编程语言:PHP或者ASP.NET或其他。
    2)英语应达到自如阅读英文技术书籍并与国外程序员自由交流程度。
    3)懂常规算法,能看懂《计算机艺术》之类的算法书并会运用于开发中。
    4)了解并使用UNIX会使用一种Shell语言。
    5)写过至少一种给其他程序员使用的库。
    5)制定过某种开发技术标准,并在一定范围内应用。
    6)发布过至少一种共享或自由软件。
    7)时常浏览全球技术网站,随时关注开发技术发展动态。

    以上只是入门程序员标准,不包括成为架构师或者管理者所需要的软件工程知识。
    达不到以上标准的不要称自己为程序员,我们都是软件工业中低层的代码工人,
    也可称为码农。楼主的困惑就是码农的困惑,定位准了,清醒的认识了自己
    你也就不那么困惑了。

  8. 爱求索 2012年06月07日 11:02 下午  @回复  Δ8楼 回复

    网络编程方面的话推荐先从一些实践性强的书籍入手,里面有各种常用的网络模型介绍以及完整的例子代码,可以很快学会上手,会用之后,建议看一下windows网络编程和tcp/Ip前两套。

    毕竟是出来工作的人 不会有那么多的时间在啃书,所以学习东西还是先从实践开始,然后再深入一些了解其内部运行原理以及注意事项,先会用了,在用的更好。这个是工作中学习最可行的方法

  9. 爱求索 2012年07月26日 11:06 下午  @回复  Δ9楼 回复

    入门经典:
    C++primer
    C++程序设计原理与实践
    C++编程思想(两卷合订本)
    标准参考读物:
    《C++程序设计语言(特别版)》
    《C++标准程序库》
    进阶读物:
    《Effective C++中文版》
    《More Effective C++中文版》
    《Effective STL中文版 》
    《Exceptional C++ Style中文版 》
    《More Exceptional C++中文版 》
    《C++沉思录》
    《C++语言99个常见编程错误》
    《C++编程规范 : 101条规则、准则与最佳实践》
    深入专题:
    《C++设计新思维》
    《深度探索C++对象模型》
    《C++ Templates中文版》
    《C++语言的设计和演化》
    《STL源码剖析》
    《设计模式》
    《C++模板元编程》
    《Boost程序库完全开发指南 : 深入C++“准”标准库》
    《Boost程序库探秘 : 深度解析C++准标准库》

    其实到了深入专题的阶段,C++已经不再是一门编程语言了,而是一种哲学,帮助你窥探计算机程序设计中最深奥那些角落。

  10. wustchange 2014年06月11日 5:07 下午  @回复  Δ10楼 回复

    现在读大一,觉得课本上的知识太浅,对于大学计算机专业的学习,大神您能给点建议吗?我的困惑是一直看不到成效,比如,自己动手做个什么的,昨日听了研究生学长的建议,他手说还是不要注重那个外表看起来炫的东西,要耐下心来看书,所以在看这些很难得书时,碰到困难该怎么去克服?
    谢谢!

外部的引用: 3 条

  • 为什么C和C++牛人多 « 求索阁
  • 学习C++从入门到精通的经典书籍(修正版) « 求索阁
  • 实用主义观点:如何学习使用C++ « 求索阁

给我留言

留言无头像?