初学者编程入门:学习C++的难度
困难之一是
" C++是一种难学而易用的语言."相信很多人都有同样的感受。学习C++的难点一是语言本身的“屏幕”太多,二是“范式转换”(思维方式的转变)。
传统语言,如C、Pascal、Basic、Fortran...,几乎一模一样,也很容易掌握,只是在外观上看起来略有不同。你想做的动作在代码中可以看得很清楚。你看不到的是,编译器给你的函数增加了一小段代码(prologue和epilogue)来处理堆栈。这一小段代码基本上是做家务的。没看到也没关系,不影响你对程序逻辑的思考。
C++不一样。C++有Otawa程序逻辑,紧密相关的动作是编译器给我们添加的。换句话说,C++编译器为我们“添加了代码”。如果不清楚这一节,学习C++就像雾里看花,雾不是雾,花不是花。
编译器给我们的C++程序添加了什么代码?很多!物体出生时会激起ctor,物体死亡时会激起dtor,这是超重的结果。Vtpr和vtbl设置在ctor,也是超重的结果。当创建单个对象时,将生成一个内存块cookie,当创建一个新对象数组时,将创建一个内部结构来记录对象大小和类指导符...,都是幕后黑手。可以说,所有代码中看不到但必须完成的与程序逻辑相关的动作,都是C++编译器加码的结果。
当“继承”发生时,整个情况就变得稍微复杂了。“多重传承”更复杂,“虚拟传承”更复杂。
这些幕后的主题可以归为所谓的C++对象模型。如果你不知道这些底层机制,你就只能死记硬背“让毁灭者在基类中虚化”或者“永远不要多态地对待数组”之类的规则,而不明白它们的道理。利用某样东西,却不明白它的道理。林语堂说“不聪明”。只知道怎么做,不知道为什么。
难度2
C++的第二个学习难点在于“范式转换”(思维方式的转移)。不要自己设计类。只是用别人的课,是一种思维模式和行为模式的转移。MFC(或OWL或VCL)程序员必须能够欣赏和理解其中的含义。
使用所谓的应用程序框架(一个大型的、内聚的类库,带有面向对象的公共基础设施),你的代码和框架是什么关系?框架提供的大量可重写虚函数的意义和价值是什么?为什么框架设计的各种好看的属性和算法,都可以应用到我们自己的类类型上?框架设计的时候,它不知道我们的存在。这就是面向对象中多态性的力量。
前面提到的C++对象模型属于编程的低级;这里说的思维模式转移是编程的高级。发挥新的思维模式的力量的最好方法是推面向对象的多态(polymorphism)和泛化(generics)。如果不使用这两个特性,就像进了C++宝山but 空又回到了家。
反复回火,循环振荡
想象C++是一把用来解决程序问题的刀。如果是坚固锋利的,必须经过多次回火,在高热和骤冷之间回火。
学完C++语法后,要尽快尝试体验多态(粗略的说就是虚函数的使用)。当你有能力掌控OOP精神的大局,却不了解C++的很多小细节的时候,就该回到C++对象模型提炼了。
成长是高阶(多态)和低阶(对象模型)之间的反复振荡,使其振荡到更高的层次,而不是一潭死水平庸于中阶(C++语法)。
0条评论