回 帖 发 新 帖 刷新版面

主题:学习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"(<Effective C++>, item14)或 "never treat arrays polymorphically" (<More Effective C++>, item 3)这类规则硬背下来,却不明白它的道理。
用一样东西,却不明白它的道理,林语堂如是说:『不高明』。只知道 how,不知道 why,侯捷如是说:『不高明』。

困难度之二

C++ 的第二个学习难度在於 "paradigm shift"(思考模式的移转)。别说自己设计 classes 了,光使用别人的 classes,就都是一种思考模式和行为模式的移转。MFC(或 OWL 或 VCL)programmer 必然甚能够领略并体会我的意思。

使用所谓的 application framework(一种大型的、凝聚性强的、有着物件导向公共基础建设的 class library),你的码和 framework 之间究竟是怎样的关系呢?framework 提供的一大堆可改写的虚拟函式的意义与价值究竟在哪里呢?为什麽 framework 所设计的种种美好性质以及各式各样的演算法竟然可以施行於我们自己设计的 class types 身上呢?framework 被设计时,并不知道我们的存在呀!

这正是物件导向中的多型(polymorphism)的威力。

稍早所说的 C++ 物件模型,偏属程式设计的低层面;这里所说的思考模式移转,则是程式设计的高层面。能够把新思维模式的威力发挥得最淋漓尽致的,当推物件导向的 polymorphism(多型)和 generalization(泛型)。如果你没有使用这两项特性,等於入 C++ 宝山而空手返。

反覆磨炼,循环震荡

想像 C++ 是一把用来解决程式问题的刀,要它坚轫,要它锋利,就必须经过多次的回火,在高热和骤冷之间 炼。

初学 C++ 语法(syntax)之後,你应该尽快尝试体验 polymorphism (大致而言也就是虚拟函式的运用)。等到对 OOP 的精神有了大局掌控的能力,但对 C++ 的许多小细节不甚清楚,就是回到C++ 物件模型 炼的时机。

成长,是在高阶(polymorphism)和低阶(object model)之间反覆震荡,才能够震荡到更高的位阶,而不是平平庸庸於中阶(C++ syntax)的一滩死水

回复列表 (共22个回复)

沙发

有来了!!!!!!!!!!

板凳

不管怎么样。楼主既然花时间写了这么多,大家就应该帮忙顶一下。

3 楼

不是我写的,我转贴!不要误会

4 楼

只要是你转的 我们就应该顶一下。毕竟不是电脑自动加进去的。

5 楼

谢谢

6 楼

很不错的帖子,谢谢楼主

7 楼

感觉写的是学所有语言的难点。。。

8 楼

怎么看不懂亚?

9 楼

应该是台湾的高手写的,8错!由此也可以看出台湾的软件确实比大陆先进。
  c++确实太复杂了,真是很难想象其实现的机制,编译器为我们作了太多的工作,感觉编译器为c++作的工作vb还多,其实现机制感觉比vb还复杂,所以我觉得c++是最高级的语言!就是中文编程工具易语言我也可以想象它是怎样实现的,而c++,我连想都不敢想!
  至于思考模式的移转,我觉得再其次了,不就是面向对象吗?你瞧java的面向对象机制多简洁!
  作者也说c++难,看似对c++很了解,其实又怎么样?根本就是一知半解!相对于c++的菜鸟来说作者绝对是高手,了解很多,但是相对c++的作者呢?我想我说一知半解并不过分吧?要不有能写个c++编译器,实现c++所有功能!如果能做到,算我有眼不识泰山。
  C++ 是个难学易用的语言,确乎如此!但是你连其大概的原理都不明白,又怎么能胡乱用呢?菜鸟学学是入入门,了解一下编程是怎么回事;而高手则必须弄通其原理,人家封装了那么多东西,谁知道编译的时候加了些什么东西?有没有后门我都怀疑。所以我从来不用c++,也不想用!

10 楼

候sir写的!

我来回复

您尚未登录,请登录后再回复。点此登录或注册