面向对象程序设计.ppt

上传人:夺命阿水 文档编号:263548 上传时间:2023-04-04 格式:PPT 页数:18 大小:190KB
返回 下载 相关 举报
面向对象程序设计.ppt_第1页
第1页 / 共18页
面向对象程序设计.ppt_第2页
第2页 / 共18页
面向对象程序设计.ppt_第3页
第3页 / 共18页
面向对象程序设计.ppt_第4页
第4页 / 共18页
面向对象程序设计.ppt_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计.ppt(18页珍藏版)》请在课桌文档上搜索。

1、第10章 面向对象程序设计,教学目的:了解面向对象程序设计的编程思想了解面向对象程序设计的基本概念了解面向对象程序设计的基本方法和实现了解面向对象的软件开发,教学内容:结构化程序设计与面向对象程序设计面向对象程序设计的基本概念面向对象程序设计的基本特定类和对象继承和派生多态性面向对象的软件开发,10.1 结构化程序设计与面向对象程序设计,10.1.1 结构化程序设计与面向对象程序设计概述,结构化程序设计的思路:自顶向下、逐步求精,其程序结构是按功能划分为若干个基本模块,这些模块形成一个树状结构;各模块之间的关系尽可能简单,在功能上相对独立;每模块内部均是由顺序、选择和循环三种基本结构组成;模块

2、实现的方法是调用子模块。优点:有效的将一个复杂的程序系统设计任务分解成易于控制和处理的子任务,便于开发和维护。缺点:把数据和处理数据的过程分离为相互独立的实体,当数据结构发生改变时,所有相关的处理过程都要进行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差。,面向对象的程序设计是由对象组合而成的,其中对象是用类来定义的,程序之间的交互主要是通过对象与对象之间的消息传递进行操作的。软件开发从本质上讲,就是对软件所要处理的问题域进行正确的认识,并把这种认识正确的描述出来。面向对象方法所强调的基本原则,就是直接面对客观存在的事务进行软件开发,将人们日常生活的习惯的思维方式和

3、表达方式应用在软件开发中,使软件开发从过分专业化的方法、规则和技巧回到客观世界,回到人们通常的思维方式。,10.1.2 结构化程序设计和面向对象程序设计解决问题的比较,解决一个设置时钟的时间,并显示出来的问题。,用结构化程序设计的方法,把各步骤分解出来做成由几个函数来解决问题,步骤如下:(1)建立结构(2)定义全局变量(3)定义设置时间函数(4)定义显示时间函数(5)定义主程序,分别调用相关函数,#includestruct time int hour,minute,second;t1;void showtime()printf(%d:%d:%dn,t1.hour,t1.minute,t1.s

4、econd);void settime(int hour,int minute,int second)t1.hour=hour;t1.minute=minute;t1.second=second;void main()settime(8,30,30);showtime();,#includeclass Clockprivate:int hour,minute,second;public:Clock()/构造函数完成数据成员的初始化 hour=0;minute=0;second=0;void settime(int h,int m,int s)/设置时间的函数 hour=h;minute=m;s

5、econd=s;void showtime()/显示时间的函数 couthour:minute:secondendl;void main()/主函数的定义 Clock c1;c1.settime(8,30,30);c1.showtime();,面向对象的程序设计的思路:把时钟问题用Clock类来实现,在主函数中,用户只需要使用Clock类设计其对象,只要明确知道Clock类的外部接口函数,也就是操作该对象的方法settime()和showtime()就可以了,至于Clock类的内部实现,使用者一概不需要知道,知道接口和接口方法是什么,只须拿来用就可以了。这样的程序设计很好的保护了各类成员数据的

6、安全,主函数代码调用极其简单,只有建立对象和调用对象方法的操作这两步而已。以后类一旦需要修改,只修改类体本身就可以,而主函数不需要做任何修改,这样就很好的做到了什么人做的事情什么人处理,互不冲突。,10.2 面向对象程序设计的基本概念,面向对象的思想认为,客观世界是由各种各样的对象构成的,每种对象都有各自的属性和行为,不同对象之间的相互作用和联系构成了不同的系统。面向对象的方法就是要面对现实世界的实体,并将其抽象为对象,以对象为基本单位,分析、设计和实现一个系统。,(1)对象对象是指现实世界中无所不在的各种各样的实体。每一个实体包括特定的静态的属性和动态的行为,在面向对象的程序设计中将该实体的

7、属性(用数据成员表示)和行为(用操作数据的函数成员表示)封装在一个整体里;每一个实体都有所属的类,在该类中还有许多其它的不同实体,因此在建立对象时,必须给对象赋予唯一的标识符,用来标识该对象。,(3)消息消息是向某对象请求服务的一种表达式,如果用户或其他对象提出服务请求,便可以称为向该对象发送消息。在面向对象的程序中,程序执行是靠对象之间传递消息来完成的。消息实现了对象与外界、对象于其他对象之间的联系,消息传递组成部分:接收消息的对象、请求对象的方法和一个或多个参数。,(2)类类是对一组对象共同具有的属性和行为的抽象,它提供了一个具有特定功能的模块和一种代码共享的手段。类是实现数据抽象和封装的

8、工具。类是一组对象的抽象,而对象则是类的一个实例。在程序中,从语法来看,类和对象的关系相当于数据类型和变量的关系。,(4)方法方法是一个函数成员,是对某个对象接受了某一消息后所采取的一系列操作的描述。,10.3 面向对象程序设计的基本特点,(1)抽象性:抽象是指忽略一类事物中与当前处理问题的主题无关的细节,包括数据抽象和代码抽象两方面,数据抽象定义了对象的属性,而代码抽象则定义了某类对象的共同行为特征。在面向对象的程序设计中,类是实现抽象的工具。(2)封装性:封装是将抽象得到的数据和代码集合在一个整体里的过程,它还具有对内部细节隐藏保护的能力,类内某些成员可以以对外隐藏的属性被保护起来。在C+

9、的内部,类是实现封装的工具,封装保证了类具有较好的独立性,防止外部程序破坏类的内部数据,同时便于程序的维护和修改。,(3)继承性:继承是一个形象的、易于理解的术语。比如子承父业、继承遗产等都涵盖了这一名词所连接的两个类层次之间的关系,既继承者拥有被继承者所有的相关属性及行为。在面向对象程序设计中,继承是一种连接类与类的层次模型,利用现有类派生新类的过程称为类的继承。新类(子类或称为派生类)拥有原有类(父类或称为基类)的特性,又增加了自身新的特性,设计程序时,只需对新增加的内容或是原内容的修改设计代码。除了共享机制,继承还具有传递机制,即最下层的子类可继承其上各层父类的全部特性。可见,继承性显著

10、简化了类和对象的创建工作量,并进一步增强了代码的可重用率,从而大大提高了软件的开发效率和系统的可靠性。,(4)多态性:多态性是指发出同样的消息被不同类型对象接收时导致的完全不同的行为,即当向不同的对象发出相同的服务请求时,会得到不同的响应。多态性允许每个对象以适合自身的方式去响应共同的消息,不必为相同的功能的操作作用于不同的对象而去特意识别,为软件开发和维护提供了极大的方便。多态性还增强了软件的灵活性和重用性,允许用户以更明确、更易懂的方式建立通用软件。多态性通常表现为:函数重载、运算符重载和虚函数。,10.4 类和对象,类是面向对象程序设计方法的核心,利用它可以实现对数据的封装、隐藏,通过类

11、的继承与派生,能够实现对问题的深入抽象的描述。类是逻辑上相关的函数与数据的封装,它是对所要处理的问题的抽象描述,类的集成程度高,适应大型复杂程序的开发。从数据类型的角度出发,类实际上相当于用户自定义的类型,它和我们前面学习的基本类型,如整型、实型有类似的特征。同样,我们可以声明某个类类型的变量,这个变量称为类的对象(或实例),这个声明的过程称为类的实例化。类和基本类型的不同之处在于,类这个特殊类型中同时包含了对数据进行操作的函数。,10.4.1 类的定义,在C+中,类定义的一般形式如下:,class 类标识符 public:成员函数或数据成员说明;private:成员函数或数据成员说明;pro

12、tected:成员函数或数据成员说明;;,(1)class为类的关键字,其后跟的类标识符为类名;(2)类的定义包括说明和实现部分,说明部分用来说明类的成员,实现部分用来定义成员函数,若成员函数在说明部分已经给出定义,则实现部分可以省略;(3)类的成员包括数据成员和函数成员(方法),数据成员主要描述本类事物的静态属性,函数成员是本类事物所具有的行为;(4)public(公有)、private(私有)、protected(保护)被称为访问权限修饰符,出现的顺序、次数没有规定,缺省是为private,它们决定了其后的成员的访问属性;(5)类的数据成员在声明时不能进行初始化。,#includeclas

13、s Clock int hour,minute,second;public:void settime(int h,int m,int s);void showtime();void clock:settime(int h,int m,int s)hour=h;minute=m;second=s;void clock:showtime()couthour:minute:secondendl;void main()/主函数的定义 Clock c1;c1.settime(8,30,30);c1.showtime();,10.4.2 对象的定义,类定义仅仅提供了一种类型定义,它本身不占用存储空间,只有

14、在定义了属于类的变量后,系统才会为其分配空间,这种变量称为对象。对象是类的实例,存储着特定的信息和作用于这些信息之上的特定操作。,2对象成员引用(1)一般对象成员引用 数据成员:对象名.成员名函数成员:对象名.成员名(参数列表)(2)通过指针引用对象成员 数据成员:对象指针名成员名 或:(*对象指针名).成员名函数成员:对象指针名成员名(参数列表)或:(*对象指针名).成员名(参数列表),1定义形式类名 对象名表列;例如,Clock是已经定义过的一个时钟类,则可定义:Clock c1,c5,*p;其中,c1是一个Clock类的对象,可以用来描述一个具体的时钟,c5则表示一个包含5个对象的对象数

15、组,而p是一个指向Clock类对象的指针。,10.4.3 对象的初始化,类的数据成员不能在声明时进行初始化,对象的数据成员的初始化是通过构造函数实现的。,1构造函数构造函数是类中特殊的成员函数,其功能是在创建对象时,使用给定的值初始化对象的数据成员,其特点如下:(1)与类名相同且不能指定任何返回类型;(2)可以重载,即可以定义多个参数类型或个数不同的构造函数;(3)在创建对象时由系统自动调用,在程序中不能直接调用;(4)当没有为一个类定义任何构造函数时,C+编译器总要为它建立一个无参的构造函数且其函数体为空,这种构造函数称为缺省构造函数。,2析构函数析构函数同构造函数一样,也是类中一种特殊的成

16、员函数,其功能是用来释放对象的,在对象的生存期结束的时候,系统会自动调用该对象的析构函数,来做一些清理的工作。其特点如下:(1)函数名与类同名,为了区别构造函数,其前加一个“”;(2)构造函数没有参数,不能重载,即一个类只能定义一个析构函数;(3)可以由系统调用,也可以由程序调用。,3拷贝构造函数在程序中常常需要用一个已知的对象来初始化一个被创建的同类对象。拷贝构造函数作为一种特殊形式的构造函数,为对象之间的这种值传递提供了方便,它将会将一个已知对象的数据成员的值拷贝给正在创建的另一个同类的对象。除具有一般构造函数的特点外,还具有如下特点:(1)只有一个参数,参数类型为本类对象的引用(C+的一

17、种特殊类型);(2)如果类中没有说明拷贝构造函数,则编译系统会自动生成一个缺省的拷贝构造函数,其形式为:类名:类名(const 类名&引用名),例10.3 定义一个点类,描述平面上的坐标,并显示其X值和Y值。#includeclass Point int X,Y;public:Point(int xx,int yy)/构造函数 X=xx;Y=yy;cout构造函数被调用!n;Point(Point/调用公开成员函数GetY()并输出其值/当p和p1的生存期结束时会两次自动调用析构函数,运行结果:构造函数被调用!拷贝构造函数被调用!34析构函数被调用!析构函数被调用!,10.5 继承和派生,面向

18、对象程序设计中提供了类的继承机制,是软件可重用性的一种体现,提供了无限重复利用程序资源的一种途径。C+程序用不同的类定义来表示一组数据以及对这些数据的操作与处理,而类之间往往具有某种关系,“继承与派生”就是类间的一种常用关系。,C+提供了类定义的派生和继承功能,使代码可重用,避免重复。通过继承机制,可以利用现有的类来定义新类。一般的称已存在的用来派生新类的类为基类或父类,派生出的新类称为派生类或子类。,10.5.1 派生类的定义,派生类的定义格式如下:,class:private:各私有成员说明;public:各公有成员说明;protected:各保护成员说明;,只从一个基类派生的的继承关系称

19、为单基继承,从两个或两个以上的类派生的继承关系称为多基继承。派生类中可出现四种成员:(1)不可访问的成员基类的private私有成员被继承过来后,这些成员在派生类中是不可访问的;(2)私有成员包括在派生类中新增加的private私有成员以及从基类私有继承过来的某些成员。这些成员在派生类中是可以访问的;(3)保护成员包括在派生类中新增加的potected保护成员以及从基类继承过来的某些成员。这些成员在派生类中是可以访问的;(4)公有成员包括在派生类中新增加的public公有成员以及从基类公有继承过来的基类的public成员。这些成员不仅在派生类中可以访问,而且在建立派生类对象的模块中,也可以通过

20、对象来访问它们。,10.5.1 派生类程序举例,利用圆类派生出圆柱体类,在圆柱体类中增加一个新的数据成员:圆柱体的高h。,#includeclass Circle double x,y,r;public:void SetC(double xx,double yy,double rr)x=xx;y=yy;r=rr;void Disp()coutCirle(x,y)endl;coutradious=rendl;class Cylinder:public Circle double h;public:void SetCY(double xx,double yy,double rr,double hh

21、)SetC(xx,yy,rr);h=hh;void Disp()Circle:Disp();couth=hendl;void main()Cylinder c1;c1.SetCY(0,0,4,6);c1.Disp();,10.6 多态性,多态性是面向对象程序设计的重要特征之一,所谓多态性是指同一个操作作用于不同的对象就会产生不同的响应。多态性分为静态多态性和动态多态性,其中函数重载和运算符重载属于静态多态性,虚函数属于动态多态性。,10.6.1 函数重载函数重载指的是,允许多个不同函数使用同一个函数名,但要求这些同名函数具有不同的参数表,其特点是:(1)参数表中的参数个数不同;(2)参数表中对

22、应的参数类型不同(3)参数表中不同类型参数的次序不同。,int abs(int n)return(n0?-n:n);float abs(float n)if(f0)f=-f;return f;,系统对函数重载这种多态性的分辨与处理,是在编译阶段完成的静态联编。,10.6.2 运算符重载,运算符重载是对已有的运算符赋予多重含义,同一个运算符作用于不同的对象导致不同行为,其实质就是函数重载。在C+中,允许对大多数的运算符进行重载,通过重新定义运算符使它能够用于特定类的对象以完成相应的功能。运算符重载的规则如下:(1)C+的运算符除个别之外,都可重载,但不允许重载非C+的运算符,如#,#;(2)重载

23、之后优先级及结合性不变;(3)运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造;(4)运算符重载实质就是函数重载,故遵循函数重载的原则。,在C+中,提供了两种运算符重载,即重载为成员函数和重载为友元函数。下面简单介绍一下重载为成员函数形式。其语法定义形式:函数类型 operator 运算符(形参表)函数体;程序中出现形式:(以双目运算符为例)c1运算符c2编译程序解释形式:c1.operator运算符(c2)其中,c1和c2均为相关对象,而“operator运算符”则是运算符重载函数名。,#includeclass Complexpublic:Complex(double r=

24、0.0,double i=0.0)real=r;imag=i;Complex operator+(Complex c);Complex operator-(Complex c);void display()cout(real,imag)endl;private:double real;double imag;Complex Complex:operator+(Complex c)return Complex(real+c.real,imag+c.imag);Complex Complex:operator-(Complex c)return Complex(real-c.real,imag-c

25、.imag);void main()Complex c1(5,4),c2(2,10),c3;c3=c1-c2;coutc3:;c3.display();c3=c1+c2;coutc3:;c3.display();,10.6.3 虚函数,虚函数是一种非静态的成员函数,反映了基类和派生类成员函数之间的一种特殊关系,虚函数是用关键字virtual 修饰的某基类中的public,protected成员函数,它可以在派生类中重新定义,以形成不同的版本,若基类中某函数被说明为虚函数,则意味着其派生类中也要用到与该函数同名、同参数表、同返回类型、但函数体(实现)不同的函数。注意:C+规定,基类指针可以指向其

26、派生类的对象(也即,可将派生类对象的地址赋给其基类指针变量),但反过来不可以。这一点正是虚函数用法的基础。在程序执行的过程中,依据指针具体只向哪个类对象,或依据引用哪个类对象,才能确定激活哪一个函数的版本,实现动态聚束,动态聚束与虚函数以及程序中使用指向基类的指针(变量)密切相关。,要实现动态多态性,需要说明的三点:(1)在基类中定义一个非静态函数为虚函数;(2)在派生类中重新定义形成不同的版本;(3)使用指向基类的指针实现动态联编。,10.7 面向对象的软件开发,早期的软件开发所面临的问题比较简单,从认清要解决的问题到编程实现并不是太难的事。随着计算机应用领域的扩展,计算机所处理的问题日益复

27、杂,软件系统的规模和复杂度空前扩大,以至于软件的复杂性和其中包含的错误已达到软件人员无法控制的程度,这就是20世纪60年代初期的“软件危机”。软件危机的出现,促进了软件工程学的形成与发展。学习面向对象的程序设计,首先应该对软件开发和维护的全过程有一个初步了解。因此,在这里我们先简要介绍一下什么是面向对象的软件工程。面向对象的软件工程是面向对象方法在软件工程领域的全面应用。它包括面向对象的分析(OOA)、面向对象的设计(OOD)、面向对象的编程(OOP)、面向对象的测试(OOT)和面向对象的软件维护(OOSM)等主要内容。,10.7.1 面向对象的分析直接用问题域中客观存在的事物建立模型中的对象

28、。10.7.2 面向对象的设计针对系统的一个具体实现运用面向对象的方法。其中包括两方面的工作,一是OOA模型直接搬到OOD,作为OOD的一部分;二是针对具体实现中的人机界面、数据存储、任务管理等因素补充一些与实现有关的部分。10.7.3 面向对象的编程用面向对象的语言把OOD模型中的每个成分书写出来。10.7.4 面向对象的测试发现软件中的错误。10.7.5 面向对象的软件维护无论经过怎样的严格测试,软件中通常还是会存在问题。因此软件在使用的过程中,需要不断地维护(OOSM)。,使用面向对象的方法开发的软件,其程序与问题域是一致的,从而减少了维护人员理解软件的难度。无论是发现了程序中的错误而追溯到问题域,还是因需求发生变化而追踪到程序,道路都是比较平坦的;而且对象的封装性使一个对象的修改对其它对象的影响很少。因此,运用面向对象的方法可以大大提高软件维护的效率。,本章小结,本章主要把结构化程序设计和面向对象程序设计做了比较分析,讲述了两种不同的程序设计方法和其优缺点。主要介绍了面向对象程序设计的基本概念对象、类、消息和方法并介绍了面向对象程序设计的基本特点抽象性、封装性、继承性和多态性。并介绍了面向对象的软件开发。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号