如何将你的编程思想,从面向过程转变为面向对象?
c&vc吧
全部回复
仅看楼主
level 9
liupengty 楼主
要搞清楚这个问题,你必须搞清楚以下3点:1、什么是面向过程的程序设计思想?2、用面向过程的程序设计思想编写程序时有什么问题?3、为解决面向过程思想中的致命缺陷,于是C语言引入了封装类,进入了面向对象的C++时代.4、为什么要叫面向对象?
2008年08月18日 09点08分 1
level 9
liupengty 楼主
1、什么是面向过程的程序设计思想?你见过下面这个程序吗?#include
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;}这是谭浩强《c语言程序设计》中例1.3的程序。用这个例子我先给你说明什么是面向过程?
2008年08月18日 09点08分 2
level 9
liupengty 楼主
这样,就先解决了,什么是面向过程的程序设计思想的问题。
2008年08月18日 09点08分 3
level 9
liupengty 楼主
上面2个程序的区别关键就在于:变量a,b在方法1中,a,b定义成了全局变量,在方法2中,a,b定义成了局部变量这里有一个前题假设:读者都知道什么是全局变量,什么是局部变量,现在,你说说上面的2种方法,哪个更好?是把a,b定义成全局变量的好,还是定义成局部变量的好?我说:都好,都不好。为什么呢?上面的两个程序中,无论哪一个,都有4个函数,方法1中,a,b是定义成全局变量,那么此时,程序中的4个函数都可以使用或更改a和b;全局变量a,b真的是好方便哦,它在4个函数中都能读写;专业些说,就是实现了4个函数的数据共享,从而弥补了局部变量只能在一个函数中被使用的不足。 这里所说的数据共享有2个含义:a、全局变量可以被4个函数读b、全局变量可以被4个函数改; 读的意思就是在全局变量被使用后,它的值不变; 改的意思就是在全局变量被使用后,它的值变了;也就是说:全局变量的值既可被4个函数读取,也可以被4个函数改变; 问题又来了,什么问题呢?
2008年08月18日 10点08分 5
level 9
liupengty 楼主
/**********************************************************/问题就在于::::全局变量a和b的值太容易被改变了!!!!!在a和b定义语句后面的所有函数,谁都能改变a,b的值;假设我的程序功能在不断的增强,改进,那么程序中的函数的数量必然在不断的增多,在某个时刻,我的这个程序中有了1000个函数!MY GOD!,如果这时,我对a或b的赋值发生一点点的错误,我只有把1000个函数从头开始,仔细的进行检查,检查所有和a或b有关的语句!!!最不幸运的情况是,我可能会查遍所有的1000个函数,才可能找到问题所在;或许啊,还不是检查1遍、2遍,也许是10遍20遍,那时,我将欲哭无泪..........全局变量的这个问题,简直太恐怖了,咋办??????????????????????????????????
2008年08月18日 10点08分 6
level 9
liupengty 楼主
那么,让我们回头看看使用局部变量定义a,b的那个例子,详见4楼。审视了方法2这个程序后,我们发现,使用局部变量定义a和b,可以避免a、b被其他函数随意修改,但同时其他函数也不能随意读取这两个变量的值。即,在max(),min(),average中,使用了main()里定义的a,b,但是,需要通过参数传递的办法,从主调函数main()传递到其他3个函数中;同时我们也发现,在max(),min(),average中,我们无法改变main()中a,b的值,原因就是C语言中,从主调函数可以将数据传入被调函数,反之不可!!!即著名的参数单向值传递原理! 我们看到: 局部变量优点在于被封装,缺点在于封装的太死,使用起来不太方便; 全局变量优点在于被共享,缺点在于不能得到某个函数的封装保护,太容易被误改。 那么,到底a,b是定义为全局变量好,还是定义为局部变量好呢?我们陷入了两难的境地........................
2008年08月18日 10点08分 7
level 9
liupengty 楼主
注意,这里使用了一个词: 封装有什么办法可以,即让我们享受到,类似函数对其局部变量的封装保护,又能象全局变量一样,方便的读取写入,唯一的办法就是: 限制全局变量的使用范围!!!在我们的C语言中,就对这种限制的思想,进行了成功尝试,这种尝试,就是把全局变量定义成静态全局变量!同时,在C语言中对于函数也进行了类似的封装保护的尝试,于是就有了内部函数和外部函数的区别.这些都是封装的可贵探索,一切的一切都是为了使全局变量,出错的范围尽可能的缩小!
2008年08月18日 10点08分 8
level 9
liupengty 楼主
注意,到此处,我们解决了一个重要的问题:问题是:“有什么办法可以让我们的变量即有局部变量的封装优点, 而使用又能象全局变量一样方便?” 回答是:“唯一的办法:对全局变量的使用范围做出合理的限制!”这个方法在c++被发挥到了极致,具体的,就是体现在类中!为解决面向过程思想中的致命缺陷,于是C语言引入了封装类,进入了面向对象的C++时代.
2008年08月18日 10点08分 9
level 9
liupengty 楼主
3、为解决面向过程思想中的致命缺陷,于是C语言引入了封装类,进入了面向对象的C++时代.好,我现在把上面4楼的程序改写为C++的程序,如下:#include
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
2008年08月18日 10点08分 10
level 9
liupengty 楼主
不是吗?不信你看: 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,以及能对a、b进行读写的函数都被封在一个大括号中,如果数据a,b的使用出现错误,我们在这个大括号的范围内搜索问题,就可以了!!!我们程序员,如果能合理的控制这对括号,所括数据和函数的数量,就会使自己的排错很容易.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!12,为了强调说明max,min,average被封入类twonum中,我们在每个函数定义的函数首部多加可一个类名,例如:void max(){...}变成了void twonum::max(){...}
2008年08月18日 10点08分 12
level 9
liupengty 楼主
4、为什么说是面向对象呀?要知道,封装是面向对象所有好处的基础,有了它,才有了继承重载,多态,关联等等面向对象的概念.那么这就是面向对象,为什么是面向对象呀?好,,下面说明下这一点:我们认识周围的东西,比如书,本,人,狗,如何区别它们呢?我们是从组成,以及从他们的动作行为,比如,一条狗组成: 一个脑袋,4条腿,一个尾巴,一张嘴,动作行为:会咬人,会汪汪叫,会跑,会走.............人组成:一个脑袋,两条腿,两个胳臂,一张嘴,没有尾巴哦,哈哈动作行为:会咬人(哈哈),会说话,会苦,会笑,会流泪...........例子太多了,我们看到每种东西的组成部分不同,而由不同的组成部分组成的东西,能够完成的动作行为也不尽相同。我们从组成和动作上,就能分出,是人,还是狗,你不会分错吧,哈哈我们就是这样认识我们周围的世界的,这就是我们习惯的思维方式,因此我们看待世间万事万物,就是观察他们的组成和动作,换句话说,组成和动作能让我们区分,某物是人,是狗,还是其他东西.如果我们把世间的东西叫对象,那么说白了,一个对象对我们人来说,就是这个对象的组成成分,以及其动作.回到C++中,类=数据+处理这些数据的函数对象=组成+动作数据就是组成,函数就是处理数据的动作,多么象现实世界的对象呀,因此,我们就称这种编写类程序的思想是面向对象的思想.
2008年08月18日 11点08分 13
level 9
liupengty 楼主
从面向过程过度到面向对象,也就革了C的命,你也就掌握了C++了!
2008年08月20日 00点08分 14
level 0
Very good!
2008年12月20日 14点12分 15
level 1
非常好
2010年06月06日 09点06分 16
level 1
强大,顺便推荐个网址http://rupeng.com/forum/tj-9034-59042.html
2010年08月22日 15点08分 17
1