- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
c的沉迷于爱恋(转贴)
c++的沉迷于爱恋(转贴)
发信人: hucong (糊聪), 信区: Program
标 题: c++的沉迷于爱恋(转贴)
发信站: 栋力无限 (Sun Apr 15 17:52:14 2001), 转信
作者:侯捷
1998.09.28 发表
每年的 09/28 於我都是一个特殊的日子 -- 不只是因为教师节。今年很特殊地没有普天
同庆,那麽我就写篇文章自己庆祝一下好了。
我於今年七月发表了一本着作 多型与虚拟 和一本译作 深度探索 C++ 物件模型 ,
获得很大的回响。这些作品都不是针对 C++ 的完全初学者所写,但从初阶到高阶为数众
多的 C++ guy,热情地表达了他们对这些主题的喜悦。
在许多来信中,我看到一些有趣的现象,也感受到一些值得整理下来的想法。所以,根
据我个人的学习过往、我的教学经验、以及周遭朋友的心得交流,写下这篇文章,或可
为後学者戒。
●多型与虚拟 序言节录
首先让我节录 多型与虚拟 一书序言:
多型与虚拟 序 节录(侯俊杰/松岗/1998/07)
一般而言,C++ 是一个难学易用的语言。
C++ 的难学,初始在於其重重的布幕,布幕之中编译器对我们的程式码做了太多的手脚
,使我们惯於循序思考的工程脑袋一无所措。及长,又面临新的思维模式,使我们必须
扭转惯常的思考习惯。
C++ 的易用则在於其巨大的弹性,能够以多型(polymorphism)、虚拟(virtual)、模
板(template)、泛型(generalization)等种种型式,让既有的码去处理未知的、未
来的资料型态。
当然,易用必须先能用。用不好或不能用的话,「写 C++ 程式」最後就成了只是「使用
C++ 编译器」,这是大家常拿来彼此调侃的笑话。
在「难学」的背景下,「易用」是使我们依然前仆後继的动力。愈来愈多的大学资讯科
系把 C++ 开在大一课程,这虽然说明 C++ 是多麽地重要,可也苦了资讯新兵们。
其实「难学」的最大症结在於,很难得有一本书,能够一针见血地指出多型与虚拟的重
要性;在我们粗具语法基础之後,直接把我们导引到最核心最重要的思想,并且在建立
这个思想的过程中,提供足够的必要基础。
●困难度之一
「C++ 是个难学易用的语言」,这句话相信很多人心有戚戚。C++ 的学习难度,一在於
语言本身太多的「幕」,一在於 paradigm shift (思考模式的移转)。
传统循序语言如 C, Pascal, Basic, Fortran...,除了模样看起来稍有不同,基本上都
是函式 call 来 call 去,大同小异,很容易掌握。你想做的动作,在 code 中都看得
一清二楚。你所看不到的,荦荦大者也不过就是编译器为你的函式加上用以处理堆叠的
一小段码(prologue 和 epilogue),这一小段码基本上做的是 housekeeping 工作,
你没看到也没有关系(更好),并不影响你对程式逻辑的思考。
C++ 不一样,C++ 有太多和程式逻辑息息相关的动作是编译器为我们加上去的。换句话
说 C++ 编译器为我们「加码」。如果不识清这一节,学习C++ 有如雾里看花,雾非雾,
花非花。
编译器为我们的 C++ 程式加了什麽码呢?很多!物件诞生时 ctor 会被唤起,物件死亡
时 dtor 会被唤起,这都是加码的结果。ctor 中设定vtpr 和 vtbl,这也是加码的结果
。new 单一物件时会产生 memory block cookie,new 物件阵列时会产生一个内部结构
记录着 object size 和 class ctor...,这也都是布幕後的工作。可以说,程式码中看
不到而却必须完成的所有与程式逻辑有关的动作,统统都是 C++ 编译器加码後的结果。
当「继承」发生,整个情况变得稍微复杂起来。「多重继承」又更复杂一些,「虚拟继
承」再更复杂一些。
这些布幕後的主题,统可归类为所谓的 C++ object model(物件模型)。如果不知道这
些底层机制,你就只能够把 make destructors virtual in base classes(Effect
ive C++, item14)或 never treat arrays polymorphically (More Effective
C++, item 3)这类规则硬背下来,却不明白它的道理。
用一样东西,却不明白它的道理,林语堂如是说:『不高明』。只知道 how,不知道 w
hy,侯捷如是说:『不高明』。
●困难度之二
C++ 的第二个学习难度在於 paradigm shift(思考模式的移转)。别说自己设计 cl
文档评论(0)