小甜瓜的C++学习经历

[原创]小甜瓜的C++学习经历
作者: littlesweetmelon 发布: bbs.vckbase.com (转载请注明)

我自学C++已经有5年了,看完过的书已经有书架上的一两排了吧。大致上有几个明显的阶
段,我想所有爱好编程、爱好C++的朋友也都有类似的经历。从2000年读大二的时候说起吧


2个月,第一重: 把以前QBasic写的程序统统翻译成C++。结构上还是函数驱动的,只是少
有的几处使用了class,类成员全为公有。见人就想吹C++,但只会讲OOP三个字母,具体好
在哪里? 反正书上说好就是好。

6个月,第二重: 写程序的结构上变为以类为主,开始尝试正确处理访问控制,数据成员
私有化,同时大规模使用成员函数。自创的单向链表类包含30多个功能,有些功能需要长
达200行的代码才能表达,这样功能才强大嘛~~~ 。所有函数前面都加个inline,提高效率
嘛~~~ 那时也搞不清楚OOP到底好在哪里,反正程序里面带了class关键字就成,也没觉得
比QBasic好用到哪去。

12个月,第三重:接触VC++,并进行简单的界面开发。那时候把书都看杂了。图书馆里只
要书名有VC二字的,不管是电脑书还是维生素药理书,统统都翻过。见到好的章节就背下
来,见到好的书就抄下来(那时不舍得花钱买书,太贵)。 记得头一次看到MFC的框架代
码的时候,脑袋都大了。那么多DECLEAR_**宏,那么多virtual函数,那么多继承。才知道
原来C++还可以这么着玩啊。 迫使我重新看以前纯C++的书,仔细琢磨那复杂的继承概念。


18个月,第四重:比较熟悉windows/MFC编程了,当时写程序已驾轻就熟,知道什么时候该
用继承,知道什么时候该用虚函数。MFC的代码就是我编程的最高追求,梦想有朝一日能写
出像MFC那么棒的类库。感觉C++已经完全掌握了,下面要做的就是补补C++知识裂缝就ok啦
。正在全面得意之时,讲windows界面编程的那些书也看到后面几章了,接触到COM这个概
念。COM类的接口居然全都是纯虚函数,创建个COM对象不但要大量继承自接口,还需要用
类厂(其实是对象厂)才能生成对应的实例。最可恶的就是那本<<COM本质论>>,里面的内
容完全看不懂不说,竟然提到我先前2年苦学的C++是学院派OOP语言,COM才是真正的面向
对象。 -_-!!! 后来又看到了那本听了名字都不想翻一页的《Inside ATL》,里面大量出
现模版和多重继承手法,完全不懂它在搞什么,被打击得不行了。 再次迫使我重新看以前
纯C++的书。 

24个月,第五重:大家可能会注意到,前面几重我总是在说看了很多书却没有提到书名,
那是因为当时的情况极其混乱,我自己根本无法鉴别哪些是好书哪些是垃圾。同学都在苦
做物理习题,我连个交流的人都没有,跟野孩子似的。想到一个疑难问题就去图书馆或书
店,把讲同一个概念的5-6本书都看一下,互相补充着理解。电脑书,尤其是讲VC的,动辄
就叫什么从SB到精通。好多都是翻译的,水平参差不齐,经常令我读得一头雾水。我记得
当时看到的最好的书就是Lippman的<<C++对象模型>>。由于是图书馆的书,借借还还的很
不方便,我就趁着上选修课的机会,把上面的重要内容全抄了一遍。看完那书之后,自我
感觉非常良好了,很喜欢其中的一句话,“知道了为什么,至于怎么做的问题就自然而然
的解决了”。很开心,我终于知道“为什么”了! 但好景不长,一个很偶然的机会,我翻
到了<<More Exceptional C++>>,那是一种C++问答式的书,40个题目,我满怀信心地看了
5个题目,没有一个答对的。-_-!!! 我一怒之下就买了这本书,这也是我买的第一本C++书
籍。从此,我心目中那完美的MFC架构设计就出现了大量的瑕疵。我可以很轻松的指出其中
很多设计缺陷,以及如何改进。我不再关注MFC里面那些无穷无尽的类了,转而专门琢磨纯粹的平台无关的C++代码。

36个月,第六重:<<More Exceptional C++>>中讲了一些STL的内容。我才认识到原来C++
还有这么一个程序库啊,就像VC有MFC似的。慢慢发现STL基本全都是模版函数模版类,用
起来真是神奇。不管什么东西,只要语法能拼在一起,就能执行。MFC中的CArray慢慢被我
替换成了vector(只可惜我还是喜欢CString胜过std::string)。下了狠心买了一本贵贵
的<<泛型编程与STL>>,仔细琢磨STL。感觉很快就体会到了STL的设计精髓,而且也会了一
些简单的模版设计。只是模版的语法太复杂了,经常编译下来有大量的书写错误,错误报
告还特别难看懂,老要改来改去的,不像普通C++程序那么容易一次写对了。那时候编程序
特别喜欢用模版,就连固定长度数组我也是自己实现一个模版类来用(boost中有对应物)
。对于模版编程的尝试就远没有练习OOP那时顺利了.经常是开始的时候设计的不错,但写
着写着就乱成一团麻了。我总是想传入一个功能很强的类给另一个类模版,而后者理所当
然的使用了这个模版参数的很多功能,以至于其语法需求高到我不可能设计出第二个类来
满足这些需求。于是出现的情况就是,还不如我取消模版技术,而直接传入一个对象指针
去让它使用。这个阶段我已经认识到了C++的博大精深,再也不敢沾沾自喜,全知全能了。我也深信过不了多久,一定会出现令我更加吃惊的C++技术。 而事
实也确实如此,那就是讲述Loki库的<<C++设计新思维>>。

48个月,第七重:C++令我欢喜令我忧。Loki库设计得实在是太炫了,C++模版技巧玩得出
神入化。仅仅是那些简单的编译期检查技术,就看得我心跳加速,激动不已。我第一次发
现,原来STL只不过C++模版的小试牛刀而已,泛型编程已经成为一种全新的编程技术。而
当我耐着性子看完<<C++设计新思维>>第3章TypeList时,我无语了。为什么学了这么久,
我对C++的理解还和作者差那么多?熟练掌握如此复杂诡异的模版语法并实作出那么优雅的
设计,这体现的是高超的编程技术还是C++巨人们的智力游戏? 我不解了。但不管怎样,
Loki这个硬骨头,还是被啃下来了。目前SourceForge的loki-lib已经比书中的改进了许多
,我只好拼命紧跟着学。吃不到猪肉好歹也看看猪跑啊。

60个月,第八重:研究生毕业,我参加了工作。公司挺器重我,委以重任,负责50万行代
码的架构设计和重构。以前都是业余时间,自己写点小程序玩玩而已。正因为代码量都不
是很大,总觉得C++那些设计技巧和规范用处不大,纸上谈兵。而现在要驾驭如此庞大的C
++代码,涉及几十个人的团队合作。我惊奇的发现,Effective/Exceptional系列中讲的知
识是何等的有用!!!其实OOP仅仅是一套方法论,通过管理依存性而管理复杂性,并不是
简单的使用C++就会得到OOP全部好处的。不同规模的系统,复杂度不同,管理依存性的方
式也就有所不同。当编程的尺度增大以后,传统的(或者说过时的)C++技术几乎不能发挥
作用,反而可能是设计陷阱。比如析构函数是不是总该是public virtual的?定义拥有pu
blic纯虚函数的接口类是否真的合适?类应该怎样继承才是合理的而不是滥用的?不光是
我,整个C++界对于语言本身的认识也是一个从清晰到混沌再到清晰的迭代过程。C++编程
实在太灵活了,单就类的设计来说,光类成员就有3种访问权限,又有3种继承权限,外加
多重继承、虚拟继承,这些东西可以组合出数百种设计方案。对于小的工程,其实任何一
种,只要用得顺手,就都可以顺利完成任务。可是对于大型工程,其中也许只有10种左右的方案是真正可行的,其他都会引入歧途,越走越远,直至程序根本
没法维护。就像1985年,C++语言推广使用的初期,Mentor Graphics公司应用它来开发大
型CAD系统。由于当时人们对OOP/C++的理解十分有限,他们吃尽了苦头。想象一下,1.2M
B的巨型string类;包含了上千个头文件的编译单元;因没有有效控制编译期依赖性,导致
微小改动都需要重新编译整个系统,而编译时间竟长达1周。对于20年后才了解C++的我,
前人的失败经验已经成为铺土石,现在有大量优秀的C++书籍讲授实用的设计经验。按理说
,我应该是幸福的。但处在第八重境界的我,却觉得写架构程序简直就是噩梦。我在写每
一行代码的时候(其实在设计阶段就已经如此了),都有5种以上的等价方案,我会问自己

  - 类接口应该是virtual的吗?
  - 应该是public的吗?
  - 应该是const的吗?
  - 应该提供默认构造函数吗?应该提供拷贝赋值操作吗?
  - 以后如果类改动或扩充了,会在多大程度上牵连其他代码?应该采用pimpl idiom吗

  - 使用继承还是包含?
  - 会抛出异常吗? 具有多高的异常安全性? 会有内存泄露吗?
  - 有没有什么办法在不损伤类型安全性前提下提供足够的灵活性?
  - 如果使用架构的人错误的使用了某些特性,能通过架构的精巧设计而尽早发现问题
吗?
  - 应该选择什么设计模式?或者是他们的组合?怎么样才能尽量减少各个模块的依存
性?
  - 整个体系是线程安全的吗? 如何改进又不太损伤效率?
  - 以上问题,我的处理方式真的都正确吗??? @_@
彻底晕菜了。这些选择题的解域空间太大,而可以肯定其中只有某些狭长的小区域是真正
正确的、通往合理架构的有效途径。问题是我如何才能找到它。。。期待在第九重境界中
能游刃有余的驾驭这些问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值