关于面向过程和面向对象的理解

要搞清楚面向过程和面向对象,必须搞清楚以下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++中,我们首先要做的是确定由哪些变量,以及由哪些函数将读写这些变量,即首先要对变量和函数的读写关系进行描述。这就是面向对象思路和面向过程思路的本质不同,在面向对象的程序设计中仍然需要编写函数,但是首先不是编写函数,是写出变量和函数的关系,术语叫类的规范说明。

最后我们要注意的是,简单来说,面向过程就是把功能代码块封装在一起叫函数;而面向对象就是把功能相近的函数与和这些函数相关的变量封装在一起,叫做类。

猜你喜欢

转载自blog.csdn.net/LAMYOO/article/details/80877006