学习C++的最大难度是什么?

转载 2007年10月09日 10:19:00
 困难度之一

  “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)的一滩死水 
 

我们应该学习什么java、C#还是C++(VC)?

此文仅代表个人观点     很多学员有这样的问题:我们应该学习什么语言,java、C#还是c++?好像很多公司都找会VC的人,java和C#有用吗?甚至有人说java或C#是小公司用的语言,C++是...
  • ttwwok
  • ttwwok
  • 2014年04月22日 10:47
  • 1451

C++难,难于上青天

[注:yqj2065的每一篇博文,因为时间、思路、态度、水平、防御和游戏心态等等各方面的问题,经常处于变动中,如添加一些东西,转载请谨慎 ] 看了几篇CSDN的专访,如1,2。有类似的话:“C++入...
  • yqj2065
  • yqj2065
  • 2013年02月16日 15:39
  • 4247

关于ES6的一些浅薄的看法(1)

最近决定专心的研究一下ES6,然后自己上网看看资料,有一点小小的收获,给大家分享一下。 ES6说简单的确是简单的,因为它相对于ES5来说,是一种优化,等于说是间接的减少了我们学习JS的难度,并且它也一...
  • javascript_k
  • javascript_k
  • 2017年01月10日 21:58
  • 208

为什么那么多人说C++难学?怎么学

对这方面感兴趣,在学习C/C++或者想学习C/C++可以加群:623357784 对于正在学习C/C++的同学来说,C语言可能不难,但是当自学C++的时候,总会出现各种问题,就像是一个恶性循环不...
  • junzi11
  • junzi11
  • 2017年05月27日 15:15
  • 1359

FFMPEG视音频编解码零基础学习方法

在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者。在和大家探讨的过程中,我忽然发现了一个问题:在“...
  • simanstar
  • simanstar
  • 2014年04月23日 10:15
  • 1698

纯手工整理Redis详细教程,学不会都难!

Linux中的Redis缓存服务器 一、Redis基础部分:  1、redis介绍与安装比mysql快10倍以上  *****************redis适用场合*******...
  • jinyeweiyang
  • jinyeweiyang
  • 2014年09月19日 16:57
  • 399

最负盛名的程序设计竞赛你都知道吗?

最负盛名的程序设计竞赛你都知道吗? 转载自:http://www.ituring.com.cn/article/45075 程序设计竞赛有着各种各样的形式,在此,我们来介绍其中最负盛名的几个。...
  • suntiezhu101288
  • suntiezhu101288
  • 2013年09月30日 17:47
  • 941

学艺不精而羞愧--论C++模板类的使用

自己断断续续地使用C++也有一段时间了,有些时候产生了自满的情绪,认为自己对C++的语言特性已经知道的差不多了,在语法方面没有什么难倒我的地方了,现在所要做的是根据实际问题编写程序,问题的难点在于算法...
  • RobertChenGuangzhi
  • RobertChenGuangzhi
  • 2015年07月25日 01:29
  • 1174

白话AI:看懂深度学习真的那么难吗?初中数学,就用10分钟

今天,面对AI如此重要的江湖地位,深度学习作为重要的一个研究分支,几乎出现在当下所有热门的AI应用领域,其中包含语义理解、图像识别、语音识别,自然语言处理等等,更有人认为当前的人工智能等同于深度学习领...
  • u010164190
  • u010164190
  • 2017年05月22日 23:40
  • 725

最大K乘积问题

①问题描述 设I 是一个n 位十进制整数。如果将I 划分为k 段,则可得到k 个整数。这k 个整数的乘积称为I 的一个k 乘积。 对于给定的I 、n和k,试设计一个算法,编程计算I 的最大k 乘积。 ...
  • qq_27601815
  • qq_27601815
  • 2016年10月26日 21:45
  • 1467
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习C++的最大难度是什么?
举报原因:
原因补充:

(最多只允许输入30个字)