其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

初学者编程入门:学习C++的最大难度


发布日期:2024年06月20日
 
初学者编程入门:学习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 cookienew 物件阵列时会产生一个内部结构记录着 object size 和 class ctor这也都是布幕后的工作可以说程式码中看不到而却必须完成的所有与程式逻辑有关的动作统统都是 C++ 编译器加码后的结果

继承发生整个情况变得稍微复杂起来多重继承又更复杂一些虚拟继承又再更复杂一些

这些布幕后的主题统可归类为所谓的 C++ object model(物件模型)如果不知道这些底层机制你就只能够把 make destructors virtual in base classesnever treat arrays polymorphically这类规则硬背下来却不明白它的道理用一样东西却不明白它的道理林语堂如是说不高明只知道 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)的一滩死水

上一篇:C++/CLI中有效使用非托管并列缓存

下一篇:Pure C++:泛型编程:模板特殊化