面向过程
倾向于我们做一件事的流程,先做什么,然后做什么,最后做什么。更接近于机器的实际计算模型。
面向对象(Object-Oriented)
倾向于建立一个对象模型,它能够近似的反映应用领域内的实体之间的关系,其本质是更接近于一种人类认知事物所采用的哲学观的计算模型。
在OO中,对象作为计算主体,拥有自己的名称,状态以及接受外界消息的接口。在对象模型中,产生新对象,旧对象销毁,发送消息,响应消息就构成OO计算模型的根本。
然而CPU并不理解对象和类,它依然在执着的先执行第一行代码,然后第二行…………所以它的执行过程依然是程序化的。
面向对象: 举个例子,盖一座大楼,你想到的是楼怎么盖,哪里要有柱子,哪里要有梁,哪里楼梯等等(这就是面向对象),至于柱子该怎么建,用什么建,方的圆的,等等,这就是面向过程。
用面向对象思考问题更符合我们人的思考方式。
其实我们人现实生活中都是在面向对象。比如:去饭店吃饭,你只要说明吃什么就可以了,有必要还了解这个菜是怎么做的,是哪里来的,怎么去种这个菜吗?
面向对象也可以说是从宏观方面思考问题,而面向过程可以说是从细节招收思考问题。在面向对象中,也存在面向过程。
zz from 百度知道
最近我也在深入学习这个东西!
首先,我们看看什么是对象的概念,对象就是我们把现实中的任何一个实体看作一个对象,对它进行研究,这个很好理解。比如说一个人就是一个对象,一个汽车也是一个对象。
面向对象就是把这个对象当作一个整体去研究,这个对象它包括自己的属性和行为,比如说人的属性是:身高、体重、体积等等。而他的行为包括吃饭、走路、睡觉等等。接着,我们再归一下类,我们可以把一个人归到学生类或者老师类当中等等,这个也很好理解。那么这个学生类就是我们说的对象抽象出来的类,它包括对象的共有的属性。比如学生这个类都有学号、班级、指导老师等等。因为学生类是一个学生这个对象的抽象,那么他就不仅包括对象所具有的属性,我们前面说对象还包括行为,那么类也有行为,比如,学生类的行为就是抽象了的对象的行为:吃饭、睡觉、学习等等。这里,我们从一个对象讲到了抽象出来的类,那么我们再从类往回讲:假如说我们先定义了一个学生类(Class:Students),然后,我们再根据这个类定义一个具体的对象,比如一个具体的学生叫小胖(学号为:08032995),那么这个学生就具体到唯一的一个人了。也就是说,类是抽象的,而对象是具体的。
我们明白了,什么是对象,什么是类之后,我们再来看看面向对象有哪些特征:
(1)对象唯一性
我们刚才说了,当我们在定义一个对象的时候,我们就已经把它具体到了某个实体,那么,他就是唯一的啦!比如说我们刚才定义了一个小胖,那么她就是中国矿业大学中一个具体的学生,她是世界上唯一的,没有第二个她了。
(2)分类性
就是说,每一个具体的对象,都有它所属的一个类,根据这些对象所共有的属性和共有的行为它们可以归入到同一类当中,比如,学生这个类就是共有共同属性和行为的:都有学号、姓名、年龄、身高、体重等等这些属性和都有上课、读书、写作业等这些行为的人组成。
(3)继承性
说到继承性可能会觉得比较复杂,其实,很简单,继承性是对类而言的,比如“学生”这个类他可以说是继承了“人”这个类,“人”具有的属性和行为“学生”都具有,比如“人”都有身高、体重、姓名这些属性,而“学生”除了具有这些属性以外还有学号这个属性。再比如说“人”有吃饭、睡觉这些行为,而“学生”还具有听讲、读书、写作业等行为。也就是说当一个类继承另一个类是,这个类出了具有它继承的那个类的所有属性和行为之外,它还有自己的多余的属性和行为。这就是继承性,有了继承也就有了子类和父类的关系,子类就是“学生”,父类就是“人”,因为“学生”是从“人”中继承过来的。
(4)多态性
一般来说,多态性比较难以理解。
资料上说“多态性使指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。”然而,这里所说的“相同的操作或函数、过程”其实并不是完全的相同,比如在这段代码里:
#include
int abs(int x) // 整数类型数据的绝对值函数
{ cout << "Using integer version of abs().\n";
return (x >= 0 ? x : -x);
}
double abs(double x) // 浮点类型数据的绝对值函数
{ cout << "Using floating-point version of abs().\n";
return (x >= 0.0 ? x : -x);
}
long abs(long x) // 长整数类型数据的绝对值函数
{ cout << "Using long integer version of abs().\n";
return (x >= 0 ? x : -x);
}
int main()
{ cout << abs(-5) << "\n"; // 调用abs()的整数版本----------------------------(1)
cout << abs(-5L) << "\n"; // 调用abs()的长整数版本---------------------(2)
cout << abs(3.14) << "\n"; // 调用abs()的浮点版本------------------------(3)
return 0;
}
这里定义了三个求绝对值得方法,比如他们同时收到了一个相同的消息:求绝对值,但是这个“相同的消息”又有不同,它们的参数不同。比如例子当中的(1)这一行,他给的参数是一个整数型,(2)是一个长整数型,(3)是一个浮点型。也就是说根据相同的消息,同样是求一个数值的绝对值,同样是求绝对值这个行为但是却调用了不同的函数,也就产生了不同的结果。打个比方:有一个学生类,它有读书这个行为,比如现在有俩个具体的学生,你给他们每人一本书,让他们读书,他们收的消息就是要求读书,但是,如果一个给他英语书,一个给他语文书,那么,它们读出来的内容肯定是不一样的。也就是上面说的,受到了相同的消息产生了不同的结果。
而在一种面向对象的语言中,所说的三个重要特点是封装性、继承性、多态性,这里的封装性,是指我们一个对象把它的属性和行为封装起来成为一个整体,外界看不到也不能随便拿来用,要想看到或拿到,必须通过这个对象本身调用。保证了一个对象数据的安全性。
这些就是我对面向对象的基本的理解。
一般来说,C++的教材中都有讲,这也是c++和c的区别。