李际军老师“面向对象程序设计”课程第一课笔记整理
面向对象程序设计概述
20世纪90年代以来面向对象程序设计(Object Oriented Programming, 简称OOP) 迅速地在全世界流行, 并一跃成为程序设计的主流技术。
现在,面向对象程序设计的思想已经被越来越多的软件设计人员所接受,不仅因为它是一种最先进的新颖的计算机程序设计思想,更主要的是这种新的思想更接近人的思维活动, 人们利用这种思想进行程序设计时,可以很大程度地提高编程能力, 减少软件维护的开销。
面向对象程序设计方法是通过增加软件的可扩充性和可重用性来提高程序员的编程能力的。这种思想与我们以前使用的方法有很大的不同,并且在理解上有一些难点。
什么是面向对象程序设计
新的程序设计范型
程序设计范型是指设计程序的规范、 模型和风格, 它是一类程序设计语言的基础。
- 面向过程程序设计范型:
- 程序=过程+调用
程序=算法+数据结构
如C、 Pascal、 Ada
函数式程序设计范型:程序被看作“描述输入与输出之间关系” 的数学函数。
如LISP
- 面向对象程序设计是一种新型的程序设计范型。 这种范型的主要特征是:
- 对象=(算法+数据结构)
- 程序=对象+消息
面向对象程序的主要结构特点:
- 第一,程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的规律。
- 第二,程序中的一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关方法完成相应的操作。
面向对象程序设计的基本概念
- 对象
- 类
- 消息
- 方法
1. 对象
在现实世界中,任何事物都是对象。可以是有形的具体存在的事物, 也可以是无形的抽象的事件。
现实世界中的对象,具有以下特性:
- 名字: 用于区别不同的实体
- 属性/状态: 属性用于描述不同实体的特征;状态由这个对象的属性和这些属性的当前值决定
- 操作: 用于描述不同实体可具有的行为,是对象提供给她用户的一种服务,也叫行为或方法
- 一类是自身所承受的操作
- 一类是施加于其他对象的操作。
在面向对象程序设计中,对象是描述其属性的属性及对这些数据施加的一组操作封装在一起构成的统一体。
对象一般可以表示为: 属性+操作(方法)
- 方法(Method)——就是对象所能执行的操作,即服务。方法描述了对象执行操作的算法,响应消息的方法。在C++中称为成员函数。
- 属性(Attribute)——就是类中所定义的数据,它是对客观世界实体所具有性质的抽象。C++中称为数据成员。
思考:
- 下列关于对象的描述不正确的是( )
- A 对象只能描述有形的东西
- B 对象具有属性和服务两个主要因素
- C 现实世界中的一切事物都可以看作对象,但只有在具体的统中加以论述才有实际的意义
D 对象的属性是对象的静态特征,服务是动态特征,并且对象的属性只能由本对象的服务来操作
A
- 构成对象的两个主要因素是( 属性 )和(服务),其中(服务)属于动态属性,(属性)属于静态属性,(属性)只能由(服务)来操作。
2. 类
在实现世界中,“类”是一组具有相同属性和行为的对象的抽象。
类和对象之间的关系是抽象和具体的关系。 类是多个对象进行综合抽象的结果,一个对象是类的一个实例。
在面向对象程序设计中, 类就是具有相同数据和相同操作的一组对象的集合。 是对具有相同数据结构和相同操作的一类对象的描述。
在面向对象程序设计中, 总是先声明类, 再由类生成其对象。
确定一个事物是一个类的步骤:
- 判断它是否有一个以上的实例,若有则可能是一个类
- 判断类的实例中有否绝对的不同点,若无则是一个类
- 如:颜色与鲜花联系在一起只是鲜花的一种状态,因为表示颜色的是一些值:红、黄、紫、白等, ++不是一个类++;
- 而颜色同包括复杂颜色计算机的图形处理系统联系在一起,这时的颜色是基于颜色三元素(红、绿、蓝)的成分比例和色度的变量,可以附带很多行为,所以++是一个类++。
可以看出,一次能正确划分类是不可能的,所以需要不断的对实际问题进行分析和整理。
注意:不能把一组函数组合在一起构成类!即类不是函数的集合。
如例,定义类Mathhelper
:
class Mathhelper{
public:
double sqrt(double aNumber);
double power(double aNumber,int raiseto);
double inverse(double aNumber);
private:
};
分析有何不妥!没有需要管理的私有数据!
思考:
- 关于类和对象的说法不正确的是()
- A 类是对象的类,对象是类的对象
- B 系统不为类分配内存空间,而为对象分配内存空间
- C 如果把人看作动物,那么细菌也是动物
- D 类可以看作数据类型,对象也可以叫做对象的实体、实例等
类是()的集合,分类的依据是()
具有相同属性和服务的一组对象 抽象
3. 消息
面向对象设计技术必须提供一种机制允许一个对象与另一个对象的交互,这种机制叫消息传递。
在面向对象程序设计中,一个对象向另一个对象发出的请求被称为“消息”。当对象收到消息时,就调用有关的方法,执行相应的操作。消息是一个对象要求另一个对象执行某个操作的的规格说明,通过消息传递才能完成对象之间的相互请求或相互协作。
消息具有三个性质:
- 同一个对象可以接收不同形式的多个消息,作出不同的响应。
- 相同形式的消息可以传递给不同的对象,所作出的响应可以是不同的。
- 对消息的响应并不是必需的, 对象可以响应消息, 也可以不响应
消息分两类
- 公有消息(其它对象发出)
- 私有消息(向自己发出)
一个消息由三部分组成:
- 接收消息的对象;
- 消息名;
- 零个或多个变元。
4. 方法
方法就是对象所能执行的操作。方法包括界面和方法体两部分。
- 方法的界面就是消息的模式,它给出了方法调用的协议;
- 方法体则是实现某种操作的一系列计算步骤,就是一段程序。
在C++语言中方法是通过函数来实现的,称为成员函数
消息和方法的关系
对象根据接收到的消息,调用相应的方法;反过来, 有了方法,对象才能响应相应的消息。
面向对象程序设计的基本特征
- 抽 象
- 封 装
- 继 承
- 多 态
1. 抽象
抽象是人类认识问题的最基本的手段之一。
抽象是通过特定的实例(对象)抽取共同性质以后形成概念的过程。抽象是对系统的简化描述和规范说明,他强调了系统中的一部分细节和特性,而忽略了其他部分。
抽象包括两个方面:数据抽象和代码抽象(或称行为抽象)。前者描述某类对象的属性和状况,也就是此类对象区别于彼类对象的特征物理量;后者描述了某类对象的共同行为特征或具有的共同操作。
在面向对象的程序设计方法中,对一个具体问题的抽象分析结果,是通过类来描述和实现的。
2. 封装 encapsulation
在现实世界中,封装就是把某个事物包围起来,使外界不知道该事物的具体内容。
在面向对象程序设计中,封装是指把数据和实现操作的代码集中起来放在对象内部,并尽可能隐蔽对象的内部细节。
封装应该具有如下几个条件:
- 对象具有一个清晰的边界,操作的代码被封装在该边界内
- 具有一个描述对象与其他对象如何相互作用的接口,该接口必须说明消息如何传递的使用方法
- 对象内部的代码和数据应受到保护,其他对象不能直接修改。
思考:
- 对象的封装就