1、面向对象程序设计引论面向对象程序设计引论 C+是以是以C语言为基础,增加了面向对象程语言为基础,增加了面向对象程序设计的功能,适合编制复杂的大型软件系统。序设计的功能,适合编制复杂的大型软件系统。重点:重点:理解理解面向对象面向对象的思想、对象、类、继承、的思想、对象、类、继承、多态性等概念多态性等概念 为什么要面向为什么要面向对象?对象?程序设计高级语言可分为四代:程序设计高级语言可分为四代:第一代第一代对数学表达式有很强的运算处理能力对数学表达式有很强的运算处理能力,如,如FORTRAN;第二代第二代如何有效表达如何有效表达算法算法,如,如PASCAL,C;第三代第三代引入了抽象数据类型引
2、入了抽象数据类型,如,如Ada;第四代第四代面向对象程序设计面向对象程序设计,如,如Simula、Smalltalk、Object-C、C+,Java;1 面向过程程序设计面向过程程序设计面向过程:面向过程:采用模块化、按照采用模块化、按照解决问题的步骤分解决问题的步骤分 步设计程序。步设计程序。面向过程设计思想的核心面向过程设计思想的核心 面向过程设计将数据结构和过程作为面向过程设计将数据结构和过程作为对待,对待,。在面向对象程序设计方法出现之前,占主流的在面向对象程序设计方法出现之前,占主流的是结构化程序设计方法,即面向过程的程序设计是结构化程序设计方法,即面向过程的程序设计语言。语言。举
3、例说明:银行系统该系统允许顾客开设不同的银行账户,其中该系统允许顾客开设不同的银行账户,其中包括现金账户、支票账户和贷款账户,同时包括现金账户、支票账户和贷款账户,同时允许顾客存款、取款和转账。允许顾客存款、取款和转账。根据面向过程的程序设计方法根据面向过程的程序设计方法 step 1:将银行系统分解成三个模块:将银行系统分解成三个模块:存款存款MakeDeposit 取款取款WithDraw 转账转账Transfer step 2:接着建立一个简单的数据结构接着建立一个简单的数据结构:struct account char name;/*姓名姓名*/unsigned long account
4、Id;/*账号账号*/float balance;/*余额余额*/float interestYTD /*年利息年利息*/Step 3:按照一定的操作顺序编写程序。按照一定的操作顺序编写程序。面向对象思想的引入面向对象思想的引入面向过程的设计存在以下缺点:面向过程的设计存在以下缺点:1、可重用性差、可重用性差 2、可维护性差、可维护性差 3、安全性差、安全性差 产生主要原因:产生主要原因:数据和过程的分离数据和过程的分离 解决途径:解决途径:引入面向对象程序设计思想引入面向对象程序设计思想对象与类是面向对象程序设计中最重要的概对象与类是面向对象程序设计中最重要的概念。念。本节要求:本节要求:理
5、解并掌握对象、类的概念理解并掌握对象、类的概念,以及它们,以及它们之间的关系之间的关系2 面向对象面向对象对象与类是面向对象程序设计中最重要的概对象与类是面向对象程序设计中最重要的概念。念。本节要求:本节要求:理解并掌握对象、类的概念理解并掌握对象、类的概念,以及它们,以及它们之间的关系之间的关系对象是客观存在的实体。对象是客观存在的实体。eg:one person a pen a cat a bird.什么是对象?什么是对象?对象有两方面的特征对象有两方面的特征其一,状态特征。笔的大小,颜色等,其一,状态特征。笔的大小,颜色等,其二,行为特征。鸟会飞,会跳跃等。其二,行为特征。鸟会飞,会跳跃
6、等。现实世界由形形色色的现实世界由形形色色的“对象对象”构成。对象由构成。对象由静态属性和动态行为构成。静态属性和动态行为构成。对象对象=属性属性+行为行为对象应具有的特性:对象应具有的特性:必须有一个区别于其它对象的名字必须有一个区别于其它对象的名字 用用属性属性(或叫状态)来描述它的某些特征(或叫状态)来描述它的某些特征 有一组有一组操作操作,每一个操作决定对象的一种,每一个操作决定对象的一种行为行为面向对象程序设计中:面向对象程序设计中:对象对象=数据数据+操作操作 注意:对象的状态不仅仅是初等的数据类型,注意:对象的状态不仅仅是初等的数据类型,许多对象可以将另一个对象作为他们状态的许多
7、对象可以将另一个对象作为他们状态的一部分。一部分。一辆车一辆车 发动机发动机发动机发动机座位座位车轮车轮车轮车轮车轮车轮座位座位座位座位气缸气缸类(class)什么是类?什么是类?类是具有共同特征类是具有共同特征的对象的抽象。的对象的抽象。eg:Person Car Cat Bird.类:类:对一组具有共同的属性特征和行为特征的对象对一组具有共同的属性特征和行为特征的对象的抽象。的抽象。类是多个对象的抽象,对象是类的一个实例类是多个对象的抽象,对象是类的一个实例 如各种鸟具有羽毛,翅膀,嘴,会飞。把这些如各种鸟具有羽毛,翅膀,嘴,会飞。把这些鸟的对象归为一类,即鸟类,鸟类具有多个对象鸟的对象归
8、为一类,即鸟类,鸟类具有多个对象共有的状态和行为。共有的状态和行为。在面向对象程序设计中,正在面向对象程序设计中,正是采用类的概念定义一组具有共同特征的对象。是采用类的概念定义一组具有共同特征的对象。类的概念以及与对象的关系类的概念以及与对象的关系类和对象是类和对象是抽象与具体抽象与具体的关系。的关系。类只在编译时存在;对象是运行时存在的实体。类只在编译时存在;对象是运行时存在的实体。例如:教师王明是一个对象例如:教师王明是一个对象 对象名:王明对象名:王明 对象的属性:对象的属性:年龄:年龄:30 学历:学历:博士博士 职称:教授职称:教授 专业:计算机软件专业:计算机软件 对象的操作;对象
9、的操作;吃饭吃饭 授课授课一个个象王明一样的具体的老师构成了世界上没有一个个象王明一样的具体的老师构成了世界上没有的抽象的的抽象的“教师教师”类。类。对象的交互在面向对象程序设计中,对象之间也需要联系,我在面向对象程序设计中,对象之间也需要联系,我们称为对象的交互。们称为对象的交互。消息传递消息传递面向对象程序设计技术提供的一种机面向对象程序设计技术提供的一种机制,允许一个对象与另一个对象的交互。制,允许一个对象与另一个对象的交互。消息消息一个对象向另一个对象发出的请求。一个对象向另一个对象发出的请求。eg:顾客对象可以请求银行账户对象的服务,如顾客对象可以请求银行账户对象的服务,如“存入存入
10、300元元”、“取出取出200元元”等,当银行账户对象等,当银行账户对象接到请求后,执行相应操作接到请求后,执行相应操作方法方法也称为操作,类似于面向过程设计中所说也称为操作,类似于面向过程设计中所说的函数。方法定义了一系列计算步骤。的函数。方法定义了一系列计算步骤。消息具有三个性质:消息具有三个性质:1、同一个对象可以接收不同形式的多个消息,做、同一个对象可以接收不同形式的多个消息,做出不同的响应出不同的响应 2、相同形式的消息可以传递给不同的对象,所做、相同形式的消息可以传递给不同的对象,所做出的响应可不同。出的响应可不同。3、消息的发送可以不考虑具体的接受者、消息的发送可以不考虑具体的接
11、受者 对象之间的消息传递机制实际上对应于面向过程对象之间的消息传递机制实际上对应于面向过程设计的过程调用,其实质是方法设计的过程调用,其实质是方法(函数)的调用函数)的调用消息的分类消息的分类 公有消息公有消息由其他对象直接发送给它的由其他对象直接发送给它的消息。被调用的方法,在所属的类中由消息。被调用的方法,在所属的类中由public说明说明 私有消息私有消息自己向自己发送的消息,由自己向自己发送的消息,由private 说明说明 类的确定与划分面向对象设计是将系统分解成若干对象,对象之间的面向对象设计是将系统分解成若干对象,对象之间的作用构成了整个系统。作用构成了整个系统。如何把实际问题的
12、事物汇聚成一个个的如何把实际问题的事物汇聚成一个个的“类类”,是面,是面向对象程序设计的一个难点。类划分得当,既有利于向对象程序设计的一个难点。类划分得当,既有利于对程序扩充,又可以提高代码的可重用性。对程序扩充,又可以提高代码的可重用性。如何确定和划分类?如何确定和划分类?基本原则:寻求一个大系统中事物的共性,将具有基本原则:寻求一个大系统中事物的共性,将具有共性的系统成为一个确定的类。共性的系统成为一个确定的类。(类不是函数的集合类不是函数的集合)3 面向对象程序设计面向对象程序设计 面向对象是一种面向对象是一种主体动作模式主体动作模式面向对象程序设计方法:面向对象程序设计方法:把问题看成
13、由许多把问题看成由许多彼此相互联系的对象组成。彼此相互联系的对象组成。面向对象方法的出发点:面向对象方法的出发点:从认识系统的方法从认识系统的方法角度,来分析、设计和实现一个系统角度,来分析、设计和实现一个系统,符合人符合人们的日常自然的思维习惯。们的日常自然的思维习惯。面向对象程序是如何设计的?面向对象程序是如何设计的?在面向对象的程序设计中,在面向对象的程序设计中,重点重点在于在于数据数据,而不是过程。数据构成了软件分解的基础,而不是过程。数据构成了软件分解的基础,而不是功能。而不是功能。以银行系统为例:以银行系统为例:解决银行账户的问题重点解决银行账户的问题重点应该放在银行账户上应该放在
14、银行账户上Step1:确定银行账户的基本数据;确定银行账户的基本数据;Step2:根据顾客在账户(数据)中要做什么,根据顾客在账户(数据)中要做什么,提出相应的操作提出相应的操作;注意:注意:不能将数据和相应操作看成两个分离的实体,而是不能将数据和相应操作看成两个分离的实体,而是作为一个完整的实体对待。把银行账户的操作定义在数据上,作为一个完整的实体对待。把银行账户的操作定义在数据上,在面向对象程序设计方法中,在面向对象程序设计方法中,银行账户就是一个类,称为银银行账户就是一个类,称为银行账户类,而每个具体的银行账户就是银行账户类的一个对行账户类,而每个具体的银行账户就是银行账户类的一个对象。
15、象。Class BankAccout public:void MakeDeposit(float amount);float WithDraw(float amount);bool Transfer(BankAccount&to,float amount);private:float balance;float interestYTD;char*owner;int account_number;面向对象程序设计的定义面向对象程序设计的定义定义:定义:面向对象程序设计是一种新的程序设计范型。面向对象程序设计是一种新的程序设计范型。主要特征:程序主要特征:程序=对象对象+消息消息 主要特点是:主要
16、特点是:1 1、程序由类的定义和类的使用两部分组成,、程序由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的在主程序中定义各对象并规定它们之间传递消息的规律。规律。2 2、程序中的一切操作都是通过向对象发送消、程序中的一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关方法完息来实现的,对象接收到消息后,启动有关方法完成相应操作。成相应操作。3 3、类有继承关系产生相互间的关系。、类有继承关系产生相互间的关系。面向对象最突出的三个特性:面向对象最突出的三个特性:封装性封装性将数据抽象的外部接口与内部将数据抽象的外部接口与内部实现的细节清楚地分开实现的细节
17、清楚地分开 继承性继承性子类可以从其父类继承属性和子类可以从其父类继承属性和操作,提高了编程效率操作,提高了编程效率 多态性多态性不同的对象收到相同的消息时不同的对象收到相同的消息时产生多种不同的行为方式产生多种不同的行为方式4 面向对象程序的特性面向对象程序的特性封装封装封装封装(Encapsulation):封装隐藏了对象的实封装隐藏了对象的实现细节。现细节。Cat封装类名类名1属性属性操作(服务)操作(服务)类名类名2属性属性操作(服务)操作(服务)封装?封装?目的:实现数据隐目的:实现数据隐藏,可以实现模块化。藏,可以实现模块化。以录音机为例,录音以录音机为例,录音机上有若干键,这些机
18、上有若干键,这些键安装在表面,通过键安装在表面,通过这些键与录音机交互,这些键与录音机交互,录音机的内部是隐蔽录音机的内部是隐蔽的,不可见的。这就的,不可见的。这就是是封装的原理封装的原理。那么。那么如何知道放音按哪个如何知道放音按哪个键,停止按哪个键呢?键,停止按哪个键呢?是录音机的是录音机的操作说明书操作说明书告诉我们如何操作录告诉我们如何操作录音机的,但操作说明书并不告诉我们录音机音机的,但操作说明书并不告诉我们录音机的内部如何去做这些事。的内部如何去做这些事。操作说明书在录音机做什么(操作说明书在录音机做什么(what to do)与怎样做(与怎样做(how to do)之间做了明确的
19、区分。之间做了明确的区分。这就是这就是所谓抽象所谓抽象的原理。抽象出来的是做什的原理。抽象出来的是做什么,而不关心如何实现这些操作。么,而不关心如何实现这些操作。在在oop中数据的封装:中数据的封装:是指将数据结构和作是指将数据结构和作用于数据结构上的一组操作放在一起组成一用于数据结构上的一组操作放在一起组成一个实体个实体-对象。数据的表示方式和对数据的对象。数据的表示方式和对数据的操作细节被隐藏起来,用户通过操作接口对操作细节被隐藏起来,用户通过操作接口对数据进行操作。对用户来说,只要知道如何数据进行操作。对用户来说,只要知道如何通过操作接口操作数据,而并不知道是如何通过操作接口操作数据,而
20、并不知道是如何做的,也不知道数据是如何表示的。做的,也不知道数据是如何表示的。数据的抽象数据的抽象则是通过对数据实例的分析,抽取则是通过对数据实例的分析,抽取其共同性质的结果。其共同性质的结果。抽象和封装是互补的,好的抽象有利于封装,抽象和封装是互补的,好的抽象有利于封装,封装的实体则帮助维护抽象的完整性。封装的实体则帮助维护抽象的完整性。下面以银行账户类为例:下面以银行账户类为例:MakeDepositWithdrawTransferbalance;interestYTDowneraccount_numberMakeDepositWithdrawTransfer 类的封装:类的封装:封装是把
21、类对象的状态方法封闭起来封装是把类对象的状态方法封闭起来,形成一个能动的实体,并提供访问形成一个能动的实体,并提供访问 它们的接口机制。它们的接口机制。面向对象程序设计语言,是把数据和处理数据面向对象程序设计语言,是把数据和处理数据的操作结合在一起而构成的一个实体,封装在一个的操作结合在一起而构成的一个实体,封装在一个模块即一个类内。对象的封装性减少了程序各部分模块即一个类内。对象的封装性减少了程序各部分之间的依赖,使程序复杂性降低,可靠性提高。之间的依赖,使程序复杂性降低,可靠性提高。理解对象的封装-对象要具有封装性,应该具备的条件:对象要具有封装性,应该具备的条件:(1).对象具有一个清楚
22、的边界,对象的私有数据、对象具有一个清楚的边界,对象的私有数据、成员函数的细节被封装在该边界内;成员函数的细节被封装在该边界内;(2).具有一个描述对象与其它对象如何相互作用具有一个描述对象与其它对象如何相互作用的接口,该接口必须说明消息传递的使用方法;的接口,该接口必须说明消息传递的使用方法;(3).对象内部的代码和数据应该受到保护,其它对象内部的代码和数据应该受到保护,其它对象不能直接修改;对象不能直接修改;对象的封装机制,可以将对象的使用者和设对象的封装机制,可以将对象的使用者和设计者分开,使用者只需要知道对象的接口。计者分开,使用者只需要知道对象的接口。封装的结果实际上隐藏了复杂性,提
23、供了代封装的结果实际上隐藏了复杂性,提供了代码重用性。码重用性。继承继承继承的概念来源现实生活 例如:子女从父母身上继承了一些特性,血型、种族等,下图说明了两个对象的继承关系:两个对象的继承关系我的父母我我们再以动物学中的动物继承性的研究为例。在图1.4的继承链中,每个类继承了它前一个类的所有特性。图1.4 动物链哺乳动物哺乳动物 热血、有毛发、用奶哺乳幼子热血、有毛发、用奶哺乳幼子狗狗 有犬牙、食肉、特定的骨骼结构、群居有犬牙、食肉、特定的骨骼结构、群居柯利狗柯利狗 尖鼻子、身体颜色红白相间、适合放牧尖鼻子、身体颜色红白相间、适合放牧 对象从类中创建出来,在面向对象的程序设计中,对象从类中创
24、建出来,在面向对象的程序设计中,类具有层次化结构,一个类的上一层为父类,下一层类具有层次化结构,一个类的上一层为父类,下一层为子类,子类可以继承父类的变量方法,且这种继承为子类,子类可以继承父类的变量方法,且这种继承具有传递性,即一个类可以继承上一层和其再上一层具有传递性,即一个类可以继承上一层和其再上一层的变量、方法。这种可传递的继承性使得下层多个相的变量、方法。这种可传递的继承性使得下层多个相似的对象可以共享上层和其上一层的数据和程序代码。似的对象可以共享上层和其上一层的数据和程序代码。这种代码共享和代码可增添的继承性的特性是这种代码共享和代码可增添的继承性的特性是C+C+灵灵活方便,提高
25、效率活方便,提高效率。类的继承:类的继承:是指新类继承原有类的全部数据、函是指新类继承原有类的全部数据、函 数和访问机制数和访问机制 继承性是指通过继承关系利用已有的类构造继承性是指通过继承关系利用已有的类构造新类。新类。广义上说,指能够直接获得已有的性质和特广义上说,指能够直接获得已有的性质和特征,而不必重复定义它们。面向对象把类组成一个征,而不必重复定义它们。面向对象把类组成一个层次结构系统(类等级):一个类的上层可以有父层次结构系统(类等级):一个类的上层可以有父类,下层可以有子类类,下层可以有子类 父类父类属性属性操作操作子类子类继承来的特性继承来的特性子类的属性子类的属性子类的操作子
26、类的操作类层次类层次继承继承 Inheritance类层次类层次继承继承 InheritanceMaterial objectAnimalMammalHumanShopkeeperFloristFloMaterial ObjectsAnimalPlantMammalDogHumanFlowerShopkeeperDoctorFloristFloDentistKentGrandmas flowerGoophy若类间具有继承关系,则它们具有几个特性:若类间具有继承关系,则它们具有几个特性:类间具有共享特征(包括数据和程序代码的类间具有共享特征(包括数据和程序代码的共享)共享)类间具有差别或新增部分
27、(包括非共享的数类间具有差别或新增部分(包括非共享的数据和程序代码)据和程序代码)类间具有层次结构类间具有层次结构 若类若类B继承类继承类A,则属于类,则属于类B的对象具有类的对象具有类A的的一切特征(包括数据属性和操作),称被继承一切特征(包括数据属性和操作),称被继承类类A为基类或父类或超类;称为基类或父类或超类;称B为类为类A的派生类的派生类或子类。也可说,类或子类。也可说,类B从类从类A派生而来。派生而来。如果类如果类B从类从类A派生,类派生,类C又从又从类类B派生,就构派生,就构成了类的层次。其中,类成了类的层次。其中,类A是类是类B的直接基类,的直接基类,是类是类C的间接基类。类的
28、间接基类。类C具有类具有类A和类和类B的所有的所有特性特性 继承机制允许派生类继承基类的数据和操作继承机制允许派生类继承基类的数据和操作(即数据成员和成员函数),允许派生类使(即数据成员和成员函数),允许派生类使用基类的数据操作。同时,派生类还可用基类的数据操作。同时,派生类还可增加增加新新的操作和数据。的操作和数据。例如,子女类可从父母类继承房子和汽车,例如,子女类可从父母类继承房子和汽车,也可使用房子和汽车,还可对房子进行再装也可使用房子和汽车,还可对房子进行再装修。修。为什么要提供继承机制?为什么要提供继承机制?继承的作用:继承的作用:1.避免代码重复开发,减少代码和数据冗余避免代码重复
29、开发,减少代码和数据冗余 2.通过增强一致性来减少模块间的接口和界通过增强一致性来减少模块间的接口和界面面继承的分类继承的分类从继承源上分:从继承源上分:单继承:只直接继承了一个基类的特征单继承:只直接继承了一个基类的特征 多继承:指多个基类派生出一个派生类多继承:指多个基类派生出一个派生类 图图1.5 单继承单继承 图图1.6 多继承多继承窗口窗口文本窗口文本窗口视图窗口视图窗口电动车电动车车车玩具玩具多态性多态性 多态性是面向对象的重要特性。是指不同多态性是面向对象的重要特性。是指不同的对象收到相同的消息是产生多种不同的行的对象收到相同的消息是产生多种不同的行为方式。为方式。例如,我们有一
30、个窗口(例如,我们有一个窗口(window)类对象,类对象,还有一个棋子(还有一个棋子(chessPiece)类对象,对它)类对象,对它们发出们发出“移动移动”的消息,的消息,“移动操作移动操作”在在window类对象和类对象和chessPiece类对象上可以类对象上可以有不同的行为。有不同的行为。C+语言支持的两种多态性语言支持的两种多态性 C+支持支持编译时的多态性编译时的多态性和和运行时的多态运行时的多态性性。编译时的多态性通过。编译时的多态性通过重载重载来实现;运行来实现;运行时的多态性通过时的多态性通过虚函数虚函数来实现,程序运行的来实现,程序运行的程序版本需要在运行时通过对象发送的
31、消息程序版本需要在运行时通过对象发送的消息来确定。来确定。重载的概念重载的概念重载包括重载包括函数重载函数重载和和运算符重载运算符重载 函数重载函数重载指一个标识符可同时用于为多指一个标识符可同时用于为多个函数命名个函数命名 运算符重载运算符重载指一个运算符可同时用于多指一个运算符可同时用于多种运算。种运算。也就是说,相同名字的函数或运算符在也就是说,相同名字的函数或运算符在不同的场合可表现出不同的行为。不同的场合可表现出不同的行为。举例举例函数重载函数重载class A Public:void Print(int i)语句段语句段1 void Print(float f)语句段语句段2 vo
32、id Print(const char*c)语句段语句段3 /其它语句其它语句 ;在类的定义中重载了在类的定义中重载了3个函数,名字都是个函数,名字都是print,它们有各自的功能。当有使用它们有各自的功能。当有使用Print函数的消息发送函数的消息发送时,跟参数的不同来调用不同的同名函数。如:时,跟参数的不同来调用不同的同名函数。如:Print(20)执行语句段执行语句段1,Print(“welcome”)将自将自动匹配语句段动匹配语句段3并执行并执行为什么使用重载?为什么使用重载?使用重载的使用重载的目的目的:更好表达行为共享,减少:更好表达行为共享,减少了程序员记忆操作名的负担。了程序员记忆操作名的负担。例如:打印整数和实数,不需要例如:打印整数和实数,不需要PrintInteger和和PrintFloat两个操作名,只需两个操作名,只需一个名字一个名字Print,编译时确定具体调用哪一个方编译时确定具体调用哪一个方法。法。5 面向对象程序的优点面向对象程序的优点可重用性,可扩充性,可靠性高。可重用性,可扩充性,可靠性高。小结小结 主要讲述了主要讲述了面向对象的概念,面向对面向对象的概念,面向对象程序的特点,面向对象程序的优点。象程序的特点,面向对象程序的优点。要求重点掌握要求重点掌握面向对象的概念面向对象的概念和和面向面向对象程序的特点对象程序的特点。