《C语言程序设计基础与实训教程 第13章》由会员分享,可在线阅读,更多相关《C语言程序设计基础与实训教程 第13章(86页珍藏版)》请在金锄头文库上搜索。
1、第1页,第13章,面向对象程序设计语言C+,第2页,主要内容,面向对象的思想 面向对象程序设计的基本概念 C+对C的扩充 类 和 对 象,第3页,13.1 面向对象的思想,结构化程序设计 面向对象程序设计,第4页,13.1.1 结构化程序设计,结构化程序设计是为了解决早期计算机程序的难于阅读、理解和调试,难于维护和扩充,以及开发周期长、不易控制程序的质量等问题而提出来的,它的产生和发展奠定了软件工程的基础。 结构化程序设计的基本思想是:自顶向下,逐步求精,将整个程序结构划分成若干个功能相对独立的模块,模块之间的联系尽可能简单;每个模块用顺序、选择、循环3种基本结构来实现;每个模块只有一个入口和
2、一个出口。,第5页,13.1.1 结构化程序设计,结构化程序设计有很多优点:各模块可以分别编程,使程序易于阅读、理解、调试和修改;方便新功能模块的扩充;功能独立的模块可以组成子程序库,有利于实现软件复用等。所以,结构化程序设计方法出现以后,很快被人们接受并得到广泛应用。,第6页,13.1.1 结构化程序设计,结构化程序设计方法以解决问题的过程作为出发点,其方法是面向过程的。它把程序定义为“数据结构+算法”,程序中数据与处理这些数据的算法(过程)是分离的。这样,对不同的数据结构作相同的处理,或对相同的数据结构作不同的处理,都要使用不同的模块,从而降低了程序的可维护性和可复用性。同时,由于这种分离
3、导致了数据可能被多个模块使用和修改,难于保证数据的安全性和一致性。因此,对于小型程序和中等复杂程度的程序来说,它是一种较为有效的技术,但对于复杂的、大规模的软件的开发来说,它就不尽如人意了。,第7页,13.1.1 结构化程序设计,通过上面的分析可以看出:结构化程序设计的核心思想是功能的分解,思想的特点是将数据结构与过程分离,着重点在过程。用这种方法开发的软件可维护性和可复用性差,第8页,13.1.2 面向对象程序设计,面向对象程序设计是在结构化程序设计的基础上发展起来的,它吸取了结构化程序设计中最为精华的部分,有人称它是被结构化了的结构化程序设计。 在面向对象程序设计中,对象是构成软件系统的基
4、本单元,并从相同类型的对象中抽象出一种新型的数据类型类,对象只是类的实例。类的成员中不仅包含有描述类对象属性的数据,还包含有对这些数据进行处理的程序代码(这些程序代码被称为对象的行为或操作)。将对象的属性和行为放在一起作为一个整体的方法称为封装,它将对象的大部分行为的实现隐蔽起来,仅通过一个可控的接口与外界交互。,第9页,13.1.2 面向对象程序设计,面向对象程序设计提供了类的继承性,可通过对一个被称为基类的类增添不同的特性来派生出多种被称为派生类的特殊类,从而使得类与类之间建立了层次结构关系,为软件复用提供了有效的途径。 面向对象程序设计支持多态性。多态性与继承性相结合,使不同结构的对象可
5、以以各自不同的方式响应同一个消息。,第10页,13.1.2 面向对象程序设计,软件系统中,对象与对象之间存在着一定的联系,这种联系通过消息的传递来实现。在面向对象程序设计中,消息表现为一个对象对另一个对象的行为的调用。,第11页,13.1.2 面向对象程序设计,通过上面的分析可以看出:面向对象程序设计的核心思想是数据的分解,着重点放在被操作的数据上,而不是实现操作的过程上。它把数据及其操作作为一个整体对待,数据本身不能被外部过程直接存取。思想的特点是程序一般由类的定义和类的使用两部分组成,主程序中定义各个对象并规定它们之间传递消息的规律,程序中的一切操作都通过向对象发送消息来实现,对象接收到消
6、息后,调用有关对象的行为来完成相应的操作。用这种方法开发的软件可维护性和可复用性高。 支持面向对象的程序设计语言很多,C+就是一种被广泛使用的、全面支持面向对象程序设计的程序设计语言。,第12页,13.2 面向对象程序设计的基本概念,对象和类 消息 抽象性 封装性 继承性 多态性,第13页,13.2.1 对象和类,对象和类的概念 对象的状态 类的确定和划分,第14页,对象和类的概念,现实世界中的对象和类 实世界中的对象是人们认识世界的基本单元,世界就是由这些基本单元对象组成的,如一个人、一辆车、一次购物、一次演出等。对象可以很简单,也可以很复杂,复杂的对象可由若干个简单对象组成。对象是现实世界
7、中的实体,具有以下特性: 每个对象都有一个用于与其他对象相区别的名字。 具有某些特征,称它为属性或状态。 有一组操作,每一个操作决定对象的一种行为即对象能干什么。 对象的状态只能被自身的行为所改变。 对象之间以消息传递的方式相互通信。 实世界中的类是对一组具有共同属性和行为的对象的抽象。如人这个类 是由老人、小孩、男人、女人等个别的人构成的,具体的某个人是人 这个类的一个实例。类和对象是抽象和具体的关系。,第15页,对象和类的概念,对象中的对象和类 面向对象中的对象是由描述其属性的数据和定义在数据上的一组操作组成的实体,是数据单元和过程单元的集合体。如学生李东是一个对象,他由描述他的特征的数据
8、和他能提供的一组操作来表征。,第16页,对象和类的概念,面向对象中的类是一组对象的抽象,这组对象有相同的属性结构和操作行为,并对这些属性结构和操作行为加以描述和说明。类是创建对象的样板,它没有具体的值和具体的操作,只有以它为样板创建的对象才有具体的值和操作。类用类名来相互区别。 对象和类的关系:一个对象是类的一个实例,有了类才能创建对象。当给类中的属性和行为赋予实际的值以后,就得到了类的一个对象。例如人这个类: 类名:人 属性:年龄、性别、身高、体重、特长、专业 操作:回答提问,对外服务 当把类名赋予实际的值李东,类的属性和操作赋予李东的属性和操作的 实际值以后,就用人这个类创建了一个对象李东
9、。,第17页,对象和类的概念,特别要指出的是,在面向对象程序设计中,类只出现在源程序代码中,不会出现在正在内存运行的程序中,换句话说,类只是在编译时存在,为对象的创建提供样板。对象作为类的实例出现在内存运行的程序中,占有内存空间,是运行时存在的实体。所以类实际上是一个新的数据类型,要使用它时,要在源程序中说明,而说明部分的代码是不在内存中运行的。在内存中运行的是类的对象,对象在内存中分派空间并完成计算任务,对象通过类来定义。所以,必须严格区分说明和定义两个概念。在C+中,把描述类的属性的数据称为数据成员,把描述行为的操作称为成员函数。,第18页,对象的状态,对象能够独立存在于现实世界中的原因是
10、每个对象都有各自的特征,这些特征就是对象的状态。如一个人的姓名、性别、年龄、身高、体重都是他的状态。人的这些状态对人这个类来说,是都具有的特征,因而是静态的。但人的状态又是可变化的,比如年龄会随时间的推移而增大,体重会在不同的时期有轻有重,因而状态的值又是动态的。对象的状态用属性的值来表征,是所有静态属性和这些属性的动态值的总和。 面向对象程序设计中对象的状态可以是初等的数据类型,如整型、实型、字符型等,也可以是用户自定义的数据类型,如结构性、枚举型等,还可以是对象,如人的状态除姓名等外,可能有家庭成员,而家庭成员是一个对象。,第19页,类的确定和划分,确定和划分类的重要性 面向对象技术是将系
11、统分解成若干对象,对象之间的相互作用构成了整个系统。类是创建对象的样板,在整体上代表一组对象,设计类而不是对象可以避免重复编码的工作,程序编码一次,就可以创建所有的对象。所以,当解决实际问题时,需要正确地进行分类。这是软件开发的第一步工作,划分的结果直接影响软件的质量。,第20页,类的确定和划分,确定和划分类的一般原则 类的确定和划分没有统一的方法,基本依赖设计人员的经验、技巧和对实际问题的理解与把握。一个基本的原则是:寻求系统中各事务的共性,将具有共性的哪些事务划分成一个类。 同一系统达到的目标不同,确定和划分的类也不相同。例如,一个学校系统,目标是教学管理,划分的类可能是教师、学生、教材、
12、课程、教室等;目标是后勤管理,划分的类可能是宿舍、食堂、后勤工作人员、教室等。,第21页,类的确定和划分,确定和划分一个事物是一个类的步骤是,先判断该事物是否有一个以上的实例对象,有则可能是一个类;再判断该事物的对象是否有绝对的不同点,没有就可确定它是一个类。 由于问题的复杂性,不能指望一次就能正确地确定和划分类,需要不断地对实际问题进行分析和整理,反复修改才能得出正确的结果。 另外,不能简单地将面向过程中的一个模块直接变成类,类不是模块函数的集合。 设计类时应有明确的标准,设计的类应该是容易理解和使用的。,第22页,13.2.2 消息,对象的交互 现实世界中的对象之间存在着各种各样的联系,正
13、是这种联系和相互作用,才构成了世界中的不同系统。同样,面向对象程序设计中的对象之间也存在着联系,称之为对象的交互,提供对象交互的机制称为消息传递。,第23页,13.2.2 消息,方法 属于一个类的对象具有相同的行为,当某个行为作用于对象时,称该对象执行了一个方法,这个方法定义了该对象要执行的一系列计算步骤,所以方法是对象操作过程的算法。,第24页,13.2.2 消息,消息 一个对象向另一个对象发出的请求称为消息,它是一个对象要求另一个对象执行某个操作的规格说明,通过消息传递才能完成对象之间的相互请求和协作。例如,学生对象请求教师对象辅导,学生对象向教师对象发出消息,教师接收到这个请求或消息后,
14、才决定做什么辅导并执行辅导。通常把发送消息的对象称为消息的发送者或请求者,而把接收消息的对象称为消息的接受者或目标对象。接受者只有在接收到消息时,才能被激活,之后才能根据消息的要求调用某个方法完成相应的操作。所以,消息传递的实质是方法的调用。,第25页,13.2.2 消息,消息具有如下性质: 同一对象可以接收不同形式的多个消息并作出不同的响应。 相同形式的消息可以传递给不同的对象,作出的响应可以是不同的。 消息的发送可以不考虑具体的接受者,对象可以响应,也可以不响应。,第26页,13.2.2 消息,对象间传递的消息一般由3部分组成,即接收对象名、调用的操作名和一个或多个参数。一个对象所能接收的
15、消息及其所带的参数就构成了该对象的外部接口。 消息分为公有消息和私有消息两类,公有消息是由其他对象发送来的消息,私有消息是自己向自己发送的消息。公有消息和私有消息的区分与消息调用的要执行方法有关,如果被调用的方法在对象类中使用public说明的,则为公有消息,如果使用private说明的,则为私有消息,私有消息只能发送调用属于自己的方法。 由此可见,类提供了完整地解决特定问题的能力,它描述了数据结构(对象属性)、算法(方法)和外部接口(消息)。对象通过外部接口接收它能识别的消息,按照自己的方式来解释这个消息并调用某个方法来执行对数据的处理,从而完成对特定问题的解决。,第27页,13.2.3 抽
16、象性,人们对世界的各种事物总是分成不同的类来管理的,而抽象是人类对事物进行分类的最基本的方法和手段。面向对象程序设计中的抽象是对一类对象进行分析和认识,经过概括,抽出一类对象的公共性质,并加以描述的过程。 对一个事物的抽象一般包括两个方面:数据抽象和行为抽象。数据抽象是对对象的属性和状态的描述,使对象之间互相区别的特征量的描述。行为抽象是对数据需要进行的处理的描述,它描述了一类对象的共同行为特征,使一类对象具有共同的功能,因此,又称行为抽象为代码抽象。,第28页,13.2.3 抽象性,例如,要设计绘制圆的图形的程序,通过分析可知,圆是这个问题中的唯一事务。对于具体的圆,有的大些,有的小些,圆的位置也不尽相同,但可用3个数据即圆心的横、纵坐标和圆的半径就可以描述圆的位置和大小,这就是对圆这个事物的数据抽象。由于抽象后没有具体的数据,它不能是一个具体的圆,只能代表一类事务圆类。要能画出圆,该程序还应有设置圆形位置、半径大小、绘制圆形的功能,这就是对圆这个事物的行为抽象。 由上面的例子看出,类的数据成员的实质就是解决问题所需要的数据,它是数据抽象的结果;而成员函数的实质是