学习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"或 "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)的一滩死水。

时间: 2024-10-30 04:49:20

学习C++编程语言的最大难度的相关文章

《R的极客理想—工具篇》—— 1.1 R是最值得学习的编程语言

1.1 R是最值得学习的编程语言 问题 为什么要学R语言? 引言 如果要问在Node.Lua.Python.Ruby和R这5种语言中,哪个语言在2014年的应用前景会更好,我会毫不犹豫地选择R,而且我认为R语言不仅是2014年,也是以后更长一段时间内的明星.在本书开篇,我们就谈谈为什么R语言是最值得学习的编程语言. 1.1.1 我的编程背景 本人是程序员.架构师,从编程入门到今天,一直深信着Java是改变世界的语言,Java已经做到了,而且一直很辉煌.但当Java越来越强大,覆盖领域越来越多,变

安卓软件开发需要学习那些编程语言

 开发需要学习那些编程语言-"> 一.编程语言的学习 安卓应用软件开发中有很多的编程语言可以使用,所以应该重点学习以下几种编程语言. ① C/C++语言. C语言是一种结构化语言.它层次清晰,便于按模块化方法安排程序,易于调试和保护.它的功用丰盛.表达力强.运用活络便当.运用面广.政策程序高.可植入性好,既有高级语言的特征,又有低级语言的许多特征,适宜作为系统描绘语言,既能够用来编写系统软件,也能够用来编写运用软件. ② Java语言.以Java语言是安卓应用软件开发的基础语言,首先把握面

如何学习一门编程语言

  选择一门语言 确定你感兴趣的领域 你可以开始学习任何编程语言(尽管其中一些被描述地比其他的更加"易学"),你得去问自己自己想用通过学习这门语言完成什么样的工作.这将会帮助你确定你应该追求的编程方式并且提供一个良好的开始. 如果你想进入Web开发行业,那你将会有一堆语言需要去学习,这和开发计算机程序相反.移动App的开发需要比PC等的开发更多的技巧.所有的这些决定将会影响着你的发展方向. 考虑从一个"易学"的语言开始 无论你做了什么样的决定,你可能只会希望从一门高

那些最适合于初学者学习的编程语言汇总

对广大程序员或编程初学者来说,有哪些最有用或最好的编程语言适宜学习? 创业者Roger Huang将为大家推荐一些编程语言,并分享个人的经验与看法.Huang是一名连续创业者,目前他正专注于他的第二个创业项目,并给予他人职业成长的建议. 有几个人曾经问我,有哪些最有用或最好的编程语言适宜学习? 姑且略过HTML/CSS不谈,我认为答案取决于你想通过编程来做什么. 要点速览 对只用一种语言来构建某个项目的情况而言,Javascript和它的框架是非常有用的. Angular.js可以控制展示给用户

怎样学习一门编程语言

选择一门语言 确定你感兴趣的领域 你可以开始学习任何编程语言(尽管其中一些被描述地比其他的更加"易学"),你得去问自己自己想用通过学习这门语言完成什么样的工作.这将会帮助你确定你应该追求的编程方式并且提供一个良好的开始. 如果你想进入Web开发行业,那你将会有一堆语言需要去学习,这和开发计算机程序相反.移动App的开发需要比PC等的开发更多的技巧.所有的这些决定将会影响着你的发展方向. 考虑从一个"易学"的语言开始 无论你做了什么样的决定,你可能只会希望从一门高水准

是什么让C#成为最值得学习的编程语言

随着 Web.iOS.Android.智能设备的流行,新的编程语言纷纷涌现并表现不俗,如 Ruby,Python,Scala,Go,Node.js,Swift 等.反观已经发展了近20年的 C# 语言(或者这里应该更准确的说是 .Net Framework),因为天生的平台局限,导致很多的 C# 程序员为了生计和前途纷纷转行投入到新语言的怀抱中.   就在此时,微软的 .Net Core 横空出世 跨平台:可以在 Windows.MacOS 和 Linux 上运行. 兼容性: .NET Core

专注学习DevOps编程语言Top 5推荐

Chris Saunders (Red Hat)一直专注于基础设施,本篇文章将介绍5大DevOps编程语言以及一些有帮助的学习资源. 在当下,了解服务器的架构和技术栈不是一个强需求的技巧.大多数的企业都不会自建物理数据中心,相反,正在设计和构建托管在公有云环境中的服务,通过代码配置.部署和管理基础设施.而这正是DevOps的核心--当代码行可以定义基础架构时,数据中心中大部分(如果不是全部)任务的自动化将成为可能. 在过去,通过高度的自动化实现持续集成/连续交付(CI / CD)是不可能的. C

最值得学习的编程语言 Java居首

经过数据分析和研究Jobs Tractor的45000个开发人员招聘职位数据,我们得到了如下的结果:Java 8,731PHP 8,238Objective-C 5,859Java for Android 4,312SQL 3,553JavaScript 3,154Ruby 2,937C# 2,549Python 1,587C++ 1,273C 685ActionScript 674ASP.net 492Perl 224Scala 143Visual Basic 92自上一年,主要的变化如下:P

同时学习多种编程语言其实很容易

大概是两年前吧,我做了个决定,要去学习编程.我买了本PHP书,开始一边阅读一边做里面的练习题.我把主要精力都放到PHP上,不理会任何其它的 语言,因为我有个习惯,一旦开始做一个事情,我们会集中所有的注意力,先把这个事情做完,然后才去做其它的事情.于是,我尝试这开发一个Web应用程序 (一个绝妙的创意,一个能使我成为另外一个Facebook创始人那样的应用).一点一点的,进度很慢,我的应用(这个即将让我成为百万富翁的应用)慢慢 的成型.最终,它跑起来了.自然了,没有人来用它,做的太烂了,到处是bu