关于面向过程和面向对象的理解
要搞清楚面向过程和面向对象,必须搞清楚以下3点:
1、么是面向过程的程序设计思想
2、面向过程的程序设计思想编写程序时有什么问题?
3、为解决面向过程思想中的致命缺陷,于是C语言引入了封装类,进入了面向对象的C++时代。
且看下面这个程序(面向过程的程序设计思想),
例1,C语言实现:
#include<stdio.h >
void main()
{
int max(int x,int y);
int a,b,c;
scanf("%d,%d",&a,&b);
c=max(a,b);
printf("max=%d\n",c);
} int max(int x, int y)
{
int z;
if(x>y)z=x;
else z=y;
return z;
}
通过这个例子我们可以知道什么是面向过程:
先解决了什么是面向过程的程序设计思想这个问题,那么对于第2个问题,用面向过程的程序设计思想编写程序时有什么问题? 我们再举一个熟悉的简单的例子:求解2个数a,b的最大值max,最小值min和平均值average。
这个例子有两种实现方法:
1.使用全局变量求解
例2,C语言实现:
#include〈stdio.h〉 float a,b;/*-----------2个全局变量--------*/ void max()/*求任意2个数字的最大值。*/ {float m; m=a>b?a:b; printf("%f\n",m); } void min()/*求任意2个数字的最小值。*/ {float m; m=a<b?a:b; printf("%f\n",m); } void average()/*求任意2个数字的平均值。*/ {float m; m=(a+b)/2; printf("%f\n",m); } void main() { scanf("%f%f",&a,&b); max(); min(); average(); }
2.用局部变量求解
例3,C语言实现:
#include〈stdio.h〉 void max(float a,float b) {printf("%f\n",a>b?a:b); } /*省略m,直接输出最大值*/ void min(float a,float b) {printf("%f\n",a<b?a:b); } /*省略m,直接输出最小值*/ void average(float a,float b) {printf("%f\n",(a+b)/2); } /*省略m,直接输出平均值*/ void main() { float a,b; scanf("%f%f",&a,&b); max(a,b); min(a,b); average(a,b); }
上面2个程序的区别就是,我把存储2个数字的变量a,b。一个程序定义成了全局变量,一个程序定义成了局部变量。我们都知道全局变量和局部变量,于是问题来了,上面的2个程序,哪个更好?即,把a,b定义成全局变量的好,还是局部变量的好?可以说:都好,都不好。
我的两个程序中,无论哪一个,都有4个函数(包含main()在内),如果a,b是定义成全局变量,这4个函数都可以读取或更改a和b,全局变量a,b真的是好方便哦,它的出现让变量在多个函数中都能用,或说实现了多个函数的数据共享,从而弥补了局部变量只能在一个函数中使用的不足。这里所说的数据共享有2个含义:全局变量可以被多个函数读和改;读的意思就是在全局变量被使用后,它的值不变;改的意思就是在全局变量被使用后,它的值变化了;也就是说:全局变量的值既可以被多个函数读取,也可以被多个函数改变。问题又来了,什么问题呢?(面向过程的问题)
全局变量a和b的值太容易被改变了,在a和b的定义语句后面,所有函数,谁都能改变它的值,那么,如果我的这个程序中有1000个函数时,我们就很难发现是谁改变了a的值,MY GOD!,如果发生对a或b的赋值发生一点错误,我只有把1000个函数从头开始,仔细的检查所有和a或b有关的赋值语句,仔细的进行研究,最不幸运的情况是,我们可能要检查遍所有的函数,才可能找到问题所在.或许,还不是检查一遍2遍,那时,我们将欲哭泪..........全局变量的这个问题,简直太恐怖了,咋办??????????那么,让我们回头看看使用局部变量定义a,b的那个例子,详见例3。审视了这个程序中的a和b,发现,使用局部变量定义a和b,会避免a、b被其他函数随意修改,但同时其它函数也不能随意读取这两个变量的值。比如我们在main()里的a,b, max(),min(),average要通过参数传递的办法来得到,且不能向它们赋新值。
我们看到:
局部变量优点在于被封装,缺点在于共享给其它函数时,使用起来不太方便;
全局变量优点在于被共享,缺点在于不能得到某个函数的封装保护。
到底a,b是定义为全局变量好,还是定义为局部变量好呢?我们陷入了两难的境地........................
注意这里使用了一个词: 封装。有什么办法可以,即让我们享受到类似函数对其局部变量的封装保护,又能象全局变量一样,方便的读取写入,唯一的办法就是:限制全局变量的使用范围。我们的C语言中就成功的尝试了这种限制的思想,就是把全局变量定义成静态全局变量!同时,在C语言中对于函数也进行了类似的封装保护的尝试,于是就有了内部函数和外部函数的区别.这些都是封装的可贵探索,一切的一切都是为了解决类似例2全局变量所出现的那种问题,使出错的范围尽可能的缩小!有什么办法可以让我们的变量即有局部变量的封装优点, 而使用又能象全局变量一样方便, 唯一的办法就是:对全局变量的使用范围做些限制。这个方法在c++被发挥到了极致,具体的,就是体现在类中!这就是3、为解决面向过程思想中的致命缺陷,于是C语言引入了封装类,进入了面向对象的C++时代。
现在,让我们开始具体说明。我现在把上面例2的程序改写为C++的程序,如下:
例4,C语言实现:
#include<stdio.h> class twonum{ public: twonum(const float,const float); void min();/*求任意2个数字的最小值。*/ void max();/*求任意2个数字的最大值。*/ void average();/*求任意2个数字的平均值。*/ private: float a,b;/*-----------2个全局变量--------*/ }; twonum::twonum(const float x=0,const float y=0)
{a=x;b=y;}
void twonum::max()/*求任意2个数字的最大值。*/ {float m; m=a>b?a:b; printf("%f\n",m); } void twonum::min()/*求任意2个数字的最小值。*/ {float m; m=a<b?a:b; printf("%f\n",m); } void twonum::average()/*求任意2个数字的平均值。*/ {float m; m=(a+b)/2.0; printf("%f\n",m); } void main()
{float a,b; scanf("%f%f",&a,&b); twonum m(a,b); m.max(); m.min(); m.average();
}
换句话说,a,b就是在class twonum{...}范围内的全局变量.要着重强调的是,不仅a,b被限制在class twonum{...}中,就连max(),min(),average()也被限制(或叫封装)在class twonum{...}中。这里的class twonum{...}原本就是一个结构体,不过这个结构体中,不仅有数据,还有函数。那么数据和函数有什么关系呢?其实我们已经看到,这些函数就是处理a,b数据的函数,我们把数据和处理它的3个函数封装在class twonum{...}中,有什么好处呢?好处就是,它彻底解决了关于全局变量的保护问题。你想:数据a,b和能对ab进行读写的函数都被封在一个大括号中,如果数据a,b的使用出现错误,我们在这个范围内搜索问题,就可以了,当我们程序员自己控制这个类的大小,就会使自己的排错很容易。!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
要知道,封装是面向对象所有好处的基础,有了它,才有了继承重载,多态,关联等等面向对象的概念。那么这就是面向对象,为什么是面向对象呀?好,最后,我们再说明一点:我们人认识周围的东西,比如从小,我们认识书,本,人,狗,如何区别它们呢?从组成,以及从他们的动作行为,比如,一条狗的组成: 一个脑袋,4条腿,一个尾巴,一张嘴,动作行为:会咬人,会汪汪叫,会跑,会走.............人的组成:一个脑袋,两条腿,两个胳臂,一张嘴,没有尾巴,动作行为:会咬人,会说话,会苦,会笑,会流泪......例子太多了,我们看到每种东西的组成部分不同,而由不同的组成部分组成的东西,完成的动作也不同。我们从组成和动作上就分出是人还是狗,我们就是这样认识我们周围的世界的,这就是我们习惯的思维方式,因此我们看待世界的万事万物,就是观察他们的组成和动作,换句话说,组成和动作能让我们唯一的确定,某物是人,是狗,还是其他东西。如果我们把世间的东西叫对象,对象对我们就是些组成和动作。回到C++中,类=数据+处理这些数据的函数,对象=组成+动作。数据就是组成,函数就是处理数据的动作,多么象现实世界的对象呀,因此,我们就称这种编写类程序的思想是面向对象的思想。解释完毕。
面向对象的程序设计思路就和面向过程的思路不同了,既然首要的任务是控制排错范围,那么在C++中,我们首先要做的是确定由哪些变量,以及由哪些函数将读写这些变量,即首先要对变量和函数的读写关系进行描述。这就是面向对象思路和面向过程思路的本质不同,在面向对象的程序设计中仍然需要编写函数,但是首先不是编写函数,是写出变量和函数的关系,术语叫类的规范说明。
最后我们要注意的是,简单来说,面向过程就是把功能代码块封装在一起叫函数;而面向对象就是把功能相近的函数与和这些函数相关的变量封装在一起,叫做类。
关于面向过程和面向对象的理解相关推荐
- 谈谈你对面向过程与面向对象的理解
面向过程编程,是一种以事物为中心的编程思想.主要关注"怎么做",即完成任务的具体细节. 面向对象编程,是一种以对象为基础的编程思想.主要关注"谁来做",即完成任 ...
- 面向对象方法的优势简化软件开发的过程_Java面试题说一说你的对面向过程和面向对象的理解...
点击上方"千锋Java学院",选择"置顶公众号" 每天一道面试模拟真题及解析 课前导读 ●回复"每日一练"获取以前的题目,持续更新! ●我希 ...
- 面向过程和面向对象的理解
面向过程: 强调是一个功能的步骤. 面向对象: 强调的是一个对象,然后由这个对象去完成相应的功能. 举例 面向过程:买电脑--取钱--坐公交车去市场--讨价还价--最终买电脑--坐车回家 面向对象:买 ...
- 如何理解面向过程和面向对象?
一句话理解面向对象 有人说:"如果上帝是程序员,他怎么创造世界上的所有动物.",理解这个问题就理解了面向对像. 面向过程和面向对象区别? 面向过程的思路:什么事都自己做:分析解决问 ...
- 面向过程和面向对象的本质理解
http://kiritor.blog.51cto.com/7400479/1226762/ 面向过程和面向对象的本质理解 面向过程就是分析出解决问题所需的步骤,面向对象则是把构成问题的事物分解成对象 ...
- 带你理解面向过程与面向对象
START WeChat Applet(公众号) :Java空巷 一.前言 如果你总是对面向对象和面向过程傻傻分不清,这篇博客尽量会用通俗的方式来讲解. 二.面向过程 概念 面向过程是一种以过程为中心 ...
- 简单抽象的去理解 面向过程和面向对象 的区别
面向过程和面向对象的区别 兴趣所致录 面向过程 场景:你是一条不折不扣的单身狗,然后还想吃苹果[手动滑稽狗头] 首先吃苹果得有苹果,所以得去买苹果,然后洗苹果, 如果焦作一下不想吃皮,你得先削皮, 要 ...
- java面向过程和面向对象
面向过程(Procedure Oriented):说的是功能的行为 面向对象(Object Oriented,简称OO):说的是功能的对象 面向过程理解: 当学习java的时候先了解java语言优良的 ...
- 面向过程与面向对象编程的区别和优缺点
■面向过程与面向对象编程的区别 转载至:https://www.cnblogs.com/strivers/p/6681876.html 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步 ...
最新文章
- QT安装由问题的,安装后发现有些控件标签名显示不了
- 《jQuery UI 开发指南》——1.3 什么是CSS主题
- 打开网页时出现DA AddrBar icon的解决方法
- - (NSString *)description
- Redis常用命令之操作SortedSet(有序集合)
- TensorFlow学习笔记(九)tf搭建神经网络基本流程
- compress命令--Linux命令应用大词典729个命令解读
- sublime 常用快捷键
- maven 里的 repositories里空的_IntelliJ IDEA 结合 maven通过profile实现多环境
- Ping32文档加密软件有哪些特点
- MFC写的单人拖拉机游戏程序
- 专业测试-自评抑郁量表SDS
- 动态图解实例 ConstraintLayout Chain
- 计算机软考软件设计师2019试题,软考2019下半年软件设计师上午真题.pdf
- python 人像素描_基于python实现把图片转换成素描
- Spotfire 数据分析学习之一
- 无刷无感直流电机驱动硬件分析
- 怎么主动发起话题_聊天怎么开启话题?学会这四点,再也不担心尴尬开场
- instagram分析以预测与安的限量版运动鞋转售价格
- python读取txt每一行按照正则匹配hon-正则表达式使用python从文件中过滤和删除特定的多行文本...
热门文章
- 使用yum报错:There are no enabled repos. Run “yum repolist all“ to see the repos you have.
- Android-smart-image-view加载网络图片
- PCA主成分分析遥感影像融合
- 内存溢出(out of memory)是内存不足吗?Outofmemory error怎么解决?
- 基于python-opencv给图像添加水印
- echarts散点图x轴和y轴在中间位置
- 关于纯前端excel上传、下载功能
- 无限能,传统中药饮片的蜕变
- 佛祖,你为什么不帮我
- OpenGL南邮计算机图形学实验报告二——两个纹理的渐变变换和移动