学习C++的最大难度

2016-02-19 15:55 5 1 收藏

今天图老师小编给大家展示的是学习C++的最大难度,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

【 tulaoshi.com - 编程语言 】


  困难度之一
  
  “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"或 "never 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)的一滩死水。

来源:http://www.tulaoshi.com/n/20160219/1610713.html

延伸阅读
1.把C++当成一门新的语言学习(和C没啥关系!真的。); 2.看《Thinking In C++》,不要看《C++变成死相》; !-- frame contents -- !-- /frame contents -- 3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看; 4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——...
C++
/*p129*/#include class CComplex{public: CCpomplex(double r=0,double i=0) { realPart=r; imagePart=i; } void print() { cout /*p129*/#include class CComplex{public: CCpomplex(double r=0,double i=0) { realPart=r; imagePart=i; } void print() { cout
对于众多人提出的c/c++中指针难学的问题做个总结: 指针学习不好关键是概念不清造成的,说的简单点就是书没有认真看,指针的学习犹如人在学习饶口令不多看多学多练是不行的,下面是两个很经典的例子,很多书上都有,对于学习的重点在于理解*指针运算符的作用,假设定义了一个指针变量x,*x所表示的其实就是变量a本身,x表示的是变量a在内存中...
递归法和回溯法 有人说,回溯实际上是递归的展开,但实际上。两者的指导思想并不一致。 !-- frame contents -- !-- /frame contents -- 打个比方吧,递归法好比是一个军队要通过一个迷宫,到了第一个分岔口,有3条路,将军命令3个小队分别去探哪条路能到出口,3个小队沿着3条路分别前进,各自到达了路...
介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。(首月免费) 图的应用恐怕是所有数据结构中最宽泛的了,但这也注定了在讲“数据结构的图”的时候没什么好讲的——关于图的最重要的是算法,而且相当的一部分都是很专业的,一般的人几乎不会接触到;相对...

经验教程

902

收藏

35
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部