C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
那么静态类型、编译式、过程化编程、面向对象编程和泛型编程该怎么理解呢?
理解静态与动态之别,我们要从变量赋值这个操作为切入点。静态类型语言中,变量的类型必须先声明,即在创建的那一刻就已经确定好变量的类型,而后的使用中,你只能将这一指定类型的数据赋值给变量。如果强行将其他不相干类型的数据赋值给它,就会引发错误。而动态类型则没有这样的限制,你将什么类型的数据赋值给变量,这个变量就是什么类型。
静态类型语言:C、C++、JAVA、C#
动态类型语言:PHP、Python、Ruby
注意:使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查。
计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。而这种转换的方式有两种:
1)编译
2)解释
由此高级语言也分为编译型语言和解释型语言。
使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。
特点:
在编译型语言写的程序执行之前,需要一个专门的编译过程,把源代码编译成机器语言的文件,如exe格式的文件,以后要再运行时,直接使用编译结果即可,如直接运行exe文件。因为只需编译一次,以后运行时不需要编译,所以编译型语言执行效率高。
总结:
1)一次性的编译成平台相关的机器语言文件,运行时脱离开发环境,运行效率高;
2)与特定平台相关,一般无法移植到其他平台;
3)现有的C、C++、Objective等都属于编译型语言。
使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。
特点:
解释型语言不需要事先编译,其直接将源代码解释成机器码并立即执行,所以只要某一平台提供了相应的解释器即可运行该程序。
总结:
1)解释型语言每次运行都需要将源代码解释称机器码并执行,效率较低;
2)只要平台提供相应的解释器,就可以运行源代码,所以可以方便源程序移植;
3)Python等属于解释型语言。
面向过程(Process Oriented)这个词是在面向对象(Object Oriented)出现之后为与之相对而提出的。其实它在以前基本被叫做“结构化编程”。是一种自顶向下逐步求精的设计方法,和单入口单出口的程序结构。分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。面向对象对实际问题构建关系,然后抽象成类,给类定义属性和方法后,再将类实例化成实例,通过访问实例的属性和方法来进行使用。
面向对象程序设计是一种自下而上的程序设计方法,往往从问题的一部分着手,一点一点地构建出整个程序。面向对象设计一数据为中心,类作为表现数据的工具,成为划分程序的基本单位。
例如五子棋:
面向过程的设计思路就是首先分析问题的步骤:
1、开始游戏,
2、黑子先走,
3、绘制画面,
4、判断输赢,
5、轮到白子,
6、绘制画面,
7、判断输赢,
8、返回步骤2,
9、输出最后结果。
把上面每个步骤用分别的函数来实现,问题就解决了。
面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:
1、黑白双方,这两方的行为是一模一样的,
2、棋盘系统,负责绘制画面,
3、规则系统,负责判定诸如犯规、输赢等。
第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
区别:主要思维的不同。具体如下:
1)通俗一点说,面向过程是数据加代码的集合,它们彼此之间的逻辑地位是对等的,因此是零散的。而面向对象则倾向于对他们分析,归纳,总结,从而提取出有组织有层次的对象的逻辑概念,并进行封装和隔离。它是一种更复合自然和人类天然认知的思维方式。
2)面向过程是一种直接的编程方法,它是按照编程语言的思路考虑问题。面向对象是一种抽象度更高的编程方法。它把眼光集中在了要解决问题本身而不是语言上,目标是使模块的抽象度更高,可复用性更好。面向对象的目的就是可复用。
3)面向对象采用空间换时间的策略,面向过程采用时间换空间的策略。
面向对象有以下几个重要特点:
(1)客观世界有对象组成
(2)对象抽象为类
(3)类与类之间存在继承关系
(4)对象之间通过传递消息而彼此联系
面向对象是一种思想,符合人们的思考习惯。面向对象的出现,让复杂的问题简单化。面向对象的出现,让曾经的执行者,变成了现在的指挥者。
封装:
封装是指将数据与具体操作的实现代码放在某个对象内部,使这些代码的实现细节不被外界发现,外界只能通过接口使用该对象,而不能通过任何形式修改对象内部实现,正是由于封装机制,程序在使用某一对象时不需要关心该对象的数据结构细节及实现操作的方法。使用封装能隐藏对象实现细节,使代码更易维护,同时因为不能直接调用、修改对象内部的私有信息,在一定程度上保证了系统安全性。
继承:
继承来源于现实世界,一个最简单的例子就是孩子会具有父母的一些特征,即每个孩子都会继承父亲或者母亲的某些特征,当然这只是最基本的继承关系,现实世界中还存在着更复杂的继承,面向对象之所以使用继承机制主要是用于实现代码的复用多个类所公用的代码部分可以只在一个类中提供,而其他类只需要继承即可。
多态:
多态与继承纤细紧密,是面向对象编程中另一个突出的特征,所谓的多态是指在继承体系中,所有派生类都从基类继承接口,但由于每个派生类都是独立的实体,因此在接收同一消息的时候,可能会生成不同的响应。多态的作用作为隐藏代码实现细节,使得代码能够模块化;扩展代码模块,实现接口重用。简单来说:一种行为产生多种效果,不同的对象调用相同的名称。
总的来说:封装可以隐藏实现细节同时包含私有成员,使得代码模块化并增加安全指数;继承可以扩展已存在的模块,目的是为了代码重用;多态则是为了保证:类在继承和派生的时候,保证家谱中任何类的实例被正确调用,实现了接口重用。
面向对象是对属性和行为(方法)的封装,是对同类事物的抽象,跟结构化编程相比它更接近自然语言。
泛型编程简单来说就是模板,是对class和operation的抽象,对class的抽象可以说是对interface的抽象,而operation抽象则是对具有同一interface的class的operation的抽象。典型应用STL。关于泛型的理解可以总结为一句话,它是把数据类型作为一种参数传递进来。
区别:
1)面向对象:封装(数据抽象)是基础,继承是手段,多态是目的;泛型编程:参数化类型(概念抽象)是基础,模板是手段,通用是目的。
2)面向对象是运行时问题空间的多态,泛型编程是编译时算法空间的多态(静态多态)。
3)泛型编程的过程就是一个不断将算法中的共性抽象提升出来的过程,最终的目的是形成一个最大程度上通用的算法或类。