我这么练习C++刀法

来源:互联网 发布:redis 如何缓存数据库 编辑:程序博客网 时间:2024/05/05 10:23

本文参考 : http://blog.csdn.net/pongba/article/details/1930150

         看了刘未鹏老师的博客, 学习C++:实践者的方法 之后,还是有蛮多感触的。

         从毕业到现在1年多了,一直自己摸爬滚打的学习C++,中间做了2个项目,是用C++的,由于刚开始就接触的是C++,所以对C++也是有感情的。以前就听老师,前辈说,语言只是工具,就像武侠里面的 刀枪棍棒,十八般武艺一样,真正重要的是内功,比如 数据结构,算法,以及对计算机底层的了解。 一直记着这些话,只是自己在工作中,1,没有耐性(相信很多人和我一样吧) 2. 工作需要,只要能完成规定时间的规定任务即可。 所以,到现在为止,对C++, 数据结构,算法等等,都处于一知半解,浅尝辄止的状态。或者说,一直没有学习编程的方法,思想。一直困惑中。。。

        今天,也就是2011-11-4号,身体不是太舒服(没状态的时候,看书,编程都提不上劲),于是在网上游荡,发现了刘老师的这篇文章,反复阅读了,觉得真的很精辟。学习C++或者使用C++编程(工作)的人,都会或多或少的去看细节。 网络上这方面的书,经典的书也很多。 只是我们好像看待问题的角度,更多的是钻到语言里面去了,其实更多的应该将自己抽身出来,再看看语言,其实它真的就只是工具而已。 我们编程的最终目的,绝大多的时候是为了去解决问题。 而不是去抠细节。而如果本身对工具不熟悉,又谈何解决问题呢?

        所以,个人觉得,工欲善其事,必先利其器。 既然咱选择了 先使用C++这把刀,就先把刀法练得纯熟了。这当然不是速成的,否则就真不值钱了。 练C++的刀法,不可能一下子掌握所有,我们得先熟悉并掌握作为刀的基本要领。其他的细枝末节的地方在和师兄弟切磋的时候,总会遇到的,留个心眼就好。 对于这刀法,刘老师就总结的比较好:二八原则。先掌握80%的情况会用到的地方,还有20%的留着切磋的时候慢慢体会。

       在此,就将刘老师的C++80%的情况列举下,我自己会好好的先熟记这部分刀法,然后在平时多加练习的。

       (以下这一小段,不是本人写的,转自刘未鹏老师的博文)

         一: C++ 主干刀法

80%场景下的复杂性:

        1. 资源管理(C++日常复杂性的最主要来源):深拷贝&浅拷贝;类的四个特殊成员函数;使用STL;RAII惯用法;智能指针等等。
        2. 对象生命期:局部&全局对象生存期;临时对象销毁;对象构造&析构顺序等等。

        3. 多态
        4. 重载决议
        5. 异常(除非你不用异常):栈开解(stack-unwinding)的过程;什么时候抛出异常;在什么抽象层面上抛出异常等等。
        6. undefined&unspecified&implementation defined三种行为的区别:i++ + ++i是undefined behavior(未定义行为——即“有问题的,坏的行为,理论上什么事情都可能发生”);参数的求值顺序是unspecified(未指定的——即“你不能依赖某个特定顺序,但其行为是良好定义的”);当一个double转换至一个float时,如果double变量的值不能精确表达在一个float中,那么选取下一个接近的离散值还是上一个接近的离散值是implementation defined(实现定义的——即“你可以在实现商的编译器文档中
找到说明”)。这些问题会影响到你编写可移植的代码。
(注:以上只是一个不完全列表,用于演示该分类标准的意义——实际上,如果我们只考虑“80%场景下的复杂性”,记忆和学习的负担便会大大减小。)

20%场景下的复杂性:

         1. 对象内存布局
         2. 模板:偏特化;非类型模板参数;模板参数推导规则;实例化;二段式名字查找;元编程等等。
         3. 名字查找&绑定规则
         4. 各种缺陷以及缺陷衍生的workarounds(C++书中把这些叫做“技术”):不支持concepts(boost.concept_check库);类型透明的typedef(true-typedef惯用法);弱类型的枚举(强枚举惯用法);隐式bool转换(safe-bool惯用法);自定义类型不支持初始化列表(boost.assign库);孱弱的元编程支持(type-traits惯用法;tag-dispatch惯用法;boost.enable_if库;boost.static_assert库);右值缺陷(loki.mojo库);不支持可变数目的模板参数列表(type-list惯用法);不支持native的alignment指定。
(注:以上只是一个不完全列表。你会发现,这些细节或技术在日常编程中极少用到,尤其是各种语言缺陷衍生出来的workarounds,构成了一个巨大的长尾,在无论是C++的书还是文献中都占有了很大的比重,作者们称它们为技术,然而实际上这些“技术”绝大多数只在库开发当中需要用到。) 


            对于80%情况会用的刀法,还是要了解并掌握的,否则谈何解决问题呢。 所以可以根据 一些书籍先来熟悉它,比如说 我目前在看 C++ Primer, 很多人说他经典,也有很多说他很庞大,我看了之后觉得,做为准备用C++这把刀的人来说,里面的一部分知识点还是必要的。 我感触最深的是 带我走进了 容器的门(进门以后,自己多研究),也带我走进了STL的门(虽然门后的世界很庞大),但这好歹也是 刀法常用的一招一式。 C++最重要的面向对象编程,以及抽象机制。 模板这部分,我暂时还没掌握。


           二:我 准备这样 熟悉刀法

             仁者见仁,智者见智。 我只是想表达下,我是如何想的。并不是正确的想法。

             熟悉刀法,自然要看刀法的书。 推荐下Accelerated C++》The C++ Programming Language》。在看书的时候,要学习照着书,一刀一式的去耍耍看,虽然咱耍的很难看。 次数多了,不就渐渐好看了嘛。

             《SLT源码剖析》我是打算过一遍的,虽然讲的很多,但对于STL,我想我们以后肯定会经常用,为什么不用熟练了呢?

               看这些基础书籍,我觉得还是不要陷进去, 对照着80%的部分,将那几个核心的招式反复练熟了。

               练熟了之后,最好能有个项目做下,(只要有心,项目总会有的)。


           三: 自己设计一套刀法

               会用了刀法,并且能和人家切磋,甚至决斗。已经有了一点自己的思路 了。 但是一招一式倒是显得有点笨拙。

              所以我觉得,之后自己应该尝试下,自己设计一套刀法,参考下《设计模式》,对决时,自己先设计好一套,那赢面就大多了。

    

          总结:

              入行晚,工作经验少,完完全全新人一个,不过我就是喜欢C++,爱屋及乌,现在对计算机相关的东西很蛮感兴趣的,我只是想好好学学她,在掌握C++之后再接触其他的,弓弩戟等。 另外一个感触就是,你思考问题的角度,有时候我们总是因为一个错误而去弥补它。 或者,我们可以这么想,有没有方法替换它? 更有甚者,我要解决什么问题,有其他更好的思路吗?(之前还是先练好刀法吧,没有刀法徒有内功又能如何呢?)