第08章类和对象

上传人:hs****ma 文档编号:568297858 上传时间:2024-07-24 格式:PPT 页数:65 大小:2.32MB
返回 下载 相关 举报
第08章类和对象_第1页
第1页 / 共65页
第08章类和对象_第2页
第2页 / 共65页
第08章类和对象_第3页
第3页 / 共65页
第08章类和对象_第4页
第4页 / 共65页
第08章类和对象_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《第08章类和对象》由会员分享,可在线阅读,更多相关《第08章类和对象(65页珍藏版)》请在金锄头文库上搜索。

1、LogoLogoAdd Your Company Slogan第第8章章 类和对象类和对象C+程序程序设计本章内容本章内容8.1 8.1 面向对象程序设计方法概述面向对象程序设计方法概述8.2 8.2 类的声明和对象的定义类的声明和对象的定义8.3 8.3 类的成员函数类的成员函数8.4 8.4 对象成员的引用对象成员的引用8.8.5 5 类和对象的简单应用举例类和对象的简单应用举例8.8.6 6 类的封装性和信息隐蔽类的封装性和信息隐蔽Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述 面向对象程序设计:面向对象程序设计:把同一对象的数据和操作封装在把同一对象的数据和操作封装在

2、一起一起,使用对象、类、继承、封装、消息等基本概念来使用对象、类、继承、封装、消息等基本概念来进行的程序设计进行的程序设计。例如:例如:人们生产汽车时,发动机、底盘、车身和轮子分别人们生产汽车时,发动机、底盘、车身和轮子分别由不同生产厂商设计和制造,最后由汽车制造商组装由不同生产厂商设计和制造,最后由汽车制造商组装在一起。在组装时,各部分之间有一定的联系,以便在一起。在组装时,各部分之间有一定的联系,以便协调工作,各部分内部如何工作一无所知。协调工作,各部分内部如何工作一无所知。为了进一步说明问题,下面先讨论几个有关的概念。为了进一步说明问题,下面先讨论几个有关的概念。OO = 对象对象 +

3、类类 + 消息消息 + 继承继承 + 封装封装 + 多态多态Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述1. 对象对象 对象对象是具有明显边界和含义的概念、抽象或事物,一是具有明显边界和含义的概念、抽象或事物,一个对象个对象代表了一个代表了一个现实的或虚拟的现实的或虚拟的实体实体。自然实体自然实体概念实体概念实体软件实体软件实体化学过程化学过程连接显示连接显示Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述1. 对象对象对象(对象(Object)是包含客观世界物体特征的抽象实体是包含客观世界物体特征的抽象实体,客观世界中任何一个事物都可以看成一个对象客观世界

4、中任何一个事物都可以看成一个对象。对象可大对象可大可小。对象是构成系统的基本单位。对象由属性可小。对象是构成系统的基本单位。对象由属性(Attribute)和行为()和行为(Action)两部分组成。)两部分组成。对象的两个要素:对象的两个要素:属性属性和和行为行为。属性:属性:对象的特征,定义成员变量描述。对象的特征,定义成员变量描述。行为:行为:对象的动作,定义成员函数完成。对象的动作,定义成员函数完成。Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述对象属性举例:对象属性举例:一个学生对象属性:姓名、号码、性别、职业、年级。一个学生对象属性:姓名、号码、性别、职业、年级。

5、一个教师对象属性:姓名、号码、性别、职业、职务。一个教师对象属性:姓名、号码、性别、职业、职务。一台录像机对象属性:型号、品牌、体积、重量、价格。一台录像机对象属性:型号、品牌、体积、重量、价格。一台笔记本电脑对象的属性:?一台笔记本电脑对象的属性:?Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述对象行为举例:对象行为举例:一个学生对象行为:听课、交作业、考试。一个学生对象行为:听课、交作业、考试。一个教师对象行为:讲课、改作业、监考。一个教师对象行为:讲课、改作业、监考。一台录像机对象行为:录像、播放、暂停、快进、一台录像机对象行为:录像、播放、暂停、快进、停止。停止。一台

6、笔记本电脑的行为:?一台笔记本电脑的行为:?Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述 在一个系统中的多个对象之间通过一定的渠道相在一个系统中的多个对象之间通过一定的渠道相互联系,如图互联系,如图8.1示意。要使某一个对象实现某一种示意。要使某一个对象实现某一种行为行为(即操作即操作),应当向它传送相应的消息。对象之间,应当向它传送相应的消息。对象之间就是这样通过发送和接收消息互相联系的。就是这样通过发送和接收消息互相联系的。Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述2、类、类 每一个实体都是对象。每一个实体都是对象。有一些对象是具有相同的结构有一些

7、对象是具有相同的结构和行为的和行为的。每个对象都属于一个特定的类型。每个对象都属于一个特定的类型。 类(类(Class)是一组是一组具有相同结构和行为具有相同结构和行为的对象的集合。的对象的集合。Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述2、类、类类的举例:类的举例: 学生类、教师类、录像机、笔记本电脑、汽学生类、教师类、录像机、笔记本电脑、汽车、饮料、气体、矿石、人、动物车、饮料、气体、矿石、人、动物.如:如:10个不同尺寸的三角形是个不同尺寸的三角形是10个对象。这个对象。这10个三角形个三角形对象有相同的属性结构和行为,可以将它们抽象为一种对象有相同的属性结构和行为

8、,可以将它们抽象为一种类型,称为三角形类型。类型,称为三角形类型。Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述3. 封装与信息隐蔽封装与信息隐蔽封装:封装:将有关的数据和操作代码封装在一个对象中,形成一个基本将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不干扰。单位,各个对象之间相对独立,互不干扰。信息隐蔽:信息隐蔽:将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留少量接口,以便与外界联系,接收外界的消息。少量接口,以便与外界联系,接收外界的消息。信息隐蔽有利于数据安全,防止无关的人了解和修

9、改数据。信息隐蔽有利于数据安全,防止无关的人了解和修改数据。封装可以降低复杂度和出错的可能性,提高类或模块封装可以降低复杂度和出错的可能性,提高类或模块的可重用性、隐藏性,使用方便,易于维护。的可重用性、隐藏性,使用方便,易于维护。Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述3. 封装与信息隐蔽封装与信息隐蔽Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述4. 继承与派生继承与派生 继承是一种由已有的类创建新类的机制。继承是一种由已有的类创建新类的机制。子类子类从父从父类继承了共性,又派生出自己的各自的特性。类继承了共性,又派生出自己的各自的特性。 父类父类

10、-子类(派生类)子类(派生类) 将门虎子将门虎子继承继承LogoLogo8.1 面向对象程序设计方法概述面向对象程序设计方法概述Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述 父类别可以被多父类别可以被多个个子类别继承子类别继承, 子类别也可以子类别也可以是别的类的父类是别的类的父类,从而,从而建立建立类继承的层次结构类继承的层次结构。Cow类Lion类Tiger类类Animals类Carnivorous类Herbivorous类Coat类Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述 C+提供

11、了继承机制,采用继承的方法可以很方便提供了继承机制,采用继承的方法可以很方便地利用一个已有的类建立一个新的类。这就是常说的地利用一个已有的类建立一个新的类。这就是常说的“软件重用软件重用”(software reusability) 的思想。的思想。继承的目的:继承的目的:实现代码重用。实现代码重用。派生的目的:派生的目的:当新的问题出现,原有程序无法解决当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。(或不能完全解决)时,需要对原有程序进行改造。Logo8.1 面向对象程序设计方法概述面向对象程序设计方法概述5. 多态性多态性由继承而产生的相关的不同的类,其对象

12、对同一由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。消息会作出不同的响应。如:动物都会叫,但不同的动物的叫声不同。如:动物都会叫,但不同的动物的叫声不同。如:在如:在Windows环境下,用鼠标双击一个文件环境下,用鼠标双击一个文件对象对象(这就是向对象传送一个消息这就是向对象传送一个消息),根据文件对,根据文件对象的不同,将做不同的操作。如果是可执行文件,象的不同,将做不同的操作。如果是可执行文件,则会执行此程序;如果是文本文件,则启动文本则会执行此程序;如果是文本文件,则启动文本编辑器并打开该文件。编辑器并打开该文件。Logo8.1.2 面向对象程序设计的特点面向对象程序

13、设计的特点面向对象程序设计面对的是一个个对象。面向对象程序设计面对的是一个个对象。程序设计者的任务包括两个方面:程序设计者的任务包括两个方面: (1)(1)设计所需的各种类和对象,即决定把哪些数据和操作封装在一设计所需的各种类和对象,即决定把哪些数据和操作封装在一起;起;(2)(2)考虑怎样向有关对象发送消息,以完成所需的任务。这时他如考虑怎样向有关对象发送消息,以完成所需的任务。这时他如同一个总调度,不断地向各个对象发出命令,让这些对象活动同一个总调度,不断地向各个对象发出命令,让这些对象活动起来起来( (或者说激活这些对象或者说激活这些对象) ),完成自己职责范围内的工作。,完成自己职责范

14、围内的工作。 各个对象的操作完成了,整体任务也就完成了。各个对象的操作完成了,整体任务也就完成了。显然,对一个显然,对一个大型任务来说,面向对象程序设计方法是十分有效的,它能大大型任务来说,面向对象程序设计方法是十分有效的,它能大大降低程序设计人员的工作难度,减少出错机会。大降低程序设计人员的工作难度,减少出错机会。Logo8.1.4 面向对象的软件开发面向对象的软件开发 随着软件规模的迅速增大,软件人员面临的问题随着软件规模的迅速增大,软件人员面临的问题十分复杂。需要规范整个软件开发过程,明确软件开十分复杂。需要规范整个软件开发过程,明确软件开发过程中每个阶段的任务,在保证前一个阶段工作的发

15、过程中每个阶段的任务,在保证前一个阶段工作的正确性的情况下,再进行下一阶段的工作。这就是软正确性的情况下,再进行下一阶段的工作。这就是软件工程学需要研究和解决的问题。件工程学需要研究和解决的问题。面向对象的软件工程包括以下几个部分:面向对象的软件工程包括以下几个部分:Logo8.1.4 面向对象的软件开发面向对象的软件开发Logo8.2 类的声明和对象的定义类的声明和对象的定义8.2.1对象和类的关系对象和类的关系每一个对象都是某一个类的实例;每一个对象都是某一个类的实例;每一个类在某一时刻都有零个或更多的实例;每一个类在某一时刻都有零个或更多的实例;类是静态的,它们的存在、语义和关系在程序执

16、行前就类是静态的,它们的存在、语义和关系在程序执行前就已经定义好了;已经定义好了;对象是动态的,它们在程序执行时可以被创建和删除;对象是动态的,它们在程序执行时可以被创建和删除;类是抽象的,不占用内存,而对象是具体的,占用存储类是抽象的,不占用内存,而对象是具体的,占用存储空间。空间。在一开始时弄清对象和类的关系是十分重要的。在一开始时弄清对象和类的关系是十分重要的。Logo8.2 类的声明和对象的定义类的声明和对象的定义8.2.1对象和类的关系对象和类的关系白马非马白马非马对象和类对象和类 这是这是中国古代伟大的逻辑学家公孙龙(约公中国古代伟大的逻辑学家公孙龙(约公元前元前320-250年)

17、提出的一个著名的逻辑问题,年)提出的一个著名的逻辑问题,出自出自公孙龙子公孙龙子白马论白马论。 类是对象的抽象,而对象是类的具体实例类是对象的抽象,而对象是类的具体实例。Logo8.2类的声明和对象的定义类的声明和对象的定义 8.2.2类的声明类的声明 在在C+中声明一个类类型和声明一个结构体类型是相中声明一个类类型和声明一个结构体类型是相似的似的。以前,定义结构体类型,描述一个对象以前,定义结构体类型,描述一个对象 :struct Student int num;char name20;char sex;Student stud1,stud2; /定义了两个结构体变量定义了两个结构体变量st

18、ud1和和stud2我们把一个对象可能具有的动作,加入到对象的描述我们把一个对象可能具有的动作,加入到对象的描述中,就形成了类。中,就形成了类。Logo8.2.2 类的声明类的声明class Student /以以class开头开头 int num;char name20; char sex; /以上以上3行是数据成员行是数据成员 void display( ) /这是成员函数这是成员函数coutnum:numendl;coutname:nameendl; coutsex:sexendl; /以上以上4行是函数中的操作语句行是函数中的操作语句 ;Student stud1,stud2; /定义

19、了两个定义了两个Student 类的对象类的对象stud1和和stud2 可以看到声明类的方法是由声明结构体类型的方法发展而来的。可以看到声明类的方法是由声明结构体类型的方法发展而来的。Logo8.2.2 类的声明类的声明class private: /私有成员,缺省存取权限私有成员,缺省存取权限 public: /公公有成员有成员 protected: /保护保护成员成员 ;Logo8.2.2 类的声明类的声明p类一经定义就形成了边界,达成了封装,就像建类一经定义就形成了边界,达成了封装,就像建 了一了一幢房子访问修饰符的作用就是在房子上开窗,开门,幢房子访问修饰符的作用就是在房子上开窗,开

20、门,让让 别人可以访问别人可以访问。访问修饰符访问修饰符Logo8.2.2 类的声明类的声明访问修饰符访问修饰符不受任何限制,不受任何限制,本类或非本类均本类或非本类均可随意访问。可随意访问。public本类及其子类可以访问本类及其子类可以访问(父子友好),同一个包(父子友好),同一个包中的其它类也可访问(包中的其它类也可访问(包内友好)。内友好)。protected只有相同包中的只有相同包中的类可以访问(包类可以访问(包内友好)。内友好)。缺缺 省省只有本类可以访问,只有本类可以访问,其余都不可以。其余都不可以。privateLogo8.2.2 类的声明类的声明publicprotected

21、private本类本类可以可以可以可以可以可以同包子类同包子类可以可以可以可以不可以不可以同包非子类同包非子类可以可以可以可以不可以不可以不同包子类不同包子类可以可以可以可以不可以不可以不同包且非子类不同包且非子类可以可以不可以不可以不可以不可以访问修饰符访问修饰符Logo8.2.2 类的声明类的声明注意:注意: (1)(1)在声明类类型时,在声明类类型时,声明为声明为privateprivate的成员和声明为的成员和声明为publicpublic的成的成员的次序任意,员的次序任意,既可以先出现既可以先出现privateprivate部分,也可以先出现部分,也可以先出现publicpublic

22、部分。部分。 (2) (2)如果在类体中既不如果在类体中既不写关键字写关键字privateprivate,又不写又不写publicpublic,就默就默认为认为privateprivate。 (3) (3)在一个类体中,关键字在一个类体中,关键字privateprivate和和publicpublic可以分别出现多次可以分别出现多次。每个部分的有效范围到出现另一个访问限定符或类体结束时每个部分的有效范围到出现另一个访问限定符或类体结束时( (最最后一个右花括号后一个右花括号) )为止。但是为了使程序清晰,应该养成这样的为止。但是为了使程序清晰,应该养成这样的习惯:习惯: 使每一种成员访问限定符

23、在类定义体中只出现一次。使每一种成员访问限定符在类定义体中只出现一次。Logo8.2.2 类的声明类的声明可以将上面类可以将上面类Student的声明改为的声明改为class Student /声明类类型声明类类型 private: /声明以下部分为私有的声明以下部分为私有的int num;char name20; char sex; public: /声明以下部分为公用的声明以下部分为公用的void display( ) coutnum:numendl;coutname:nameendl;coutsex:sex id name major fees; ; Student stu1,stu2;

24、Logo8.2.3 对象的定义对象的定义2. 在声明类类型的同时定义对象在声明类类型的同时定义对象class Studentprivate: int id;char name20; char major20; float fees; public:void register ( ) cin id name major fees; stud1,stud2; /定义了两个定义了两个Student类的对象类的对象在定义在定义Student类的同时,定义了两个类的同时,定义了两个Student 类的对象。类的对象。Logo8.2.3 对象的定义对象的定义3. 不出现类名,直接定义对象不出现类名,直接定

25、义对象class /无类名无类名private: /声明以下部分为私有的声明以下部分为私有的. public: /声明以下部分为公用的声明以下部分为公用的. stud1, stud2; /定义了两个无类名的类对象定义了两个无类名的类对象p这种方法很少用。在实际的程序开发中,这种方法很少用。在实际的程序开发中,一般都采用第一般都采用第1种种方法。方法。p在定义一个对象时,编译系统会为这个对象分配存储空间,在定义一个对象时,编译系统会为这个对象分配存储空间,以存放对象中的成员。以存放对象中的成员。Logo8.3 类的成员函数类的成员函数8.3.1 成员函数的性质成员函数的性质类的成员函数与一般函数

26、的区别只是:类的成员函数与一般函数的区别只是: 它是属于一它是属于一个类的成员,出现在类体中。可以指定为个类的成员,出现在类体中。可以指定为private、 public、protected成员函数可以访问本类中成员函数可以访问本类中任何成员任何成员(包括私有和公用包括私有和公用数据和函数成员数据和函数成员) 。Logo8.3 类的成员函数类的成员函数如何指定类的成员函数为如何指定类的成员函数为public还是还是private?(1)一般将需要被外界调用的成员函数指定为一般将需要被外界调用的成员函数指定为public,它们是类的对外接口。它们是类的对外接口。(2)不被外界调用的,而只是为本类

27、中的成员函数所调不被外界调用的,而只是为本类中的成员函数所调用的函数,应指定为用的函数,应指定为private。这种函数的作用是支这种函数的作用是支持其他函数的操作,是类中其他成员的工具函数,类持其他函数的操作,是类中其他成员的工具函数,类外用户不能调用这些私有的工具函数。外用户不能调用这些私有的工具函数。 Logo8.3.2 在类外定义成员函数在类外定义成员函数 成员函数可以在类体中定义,也可以在类外定义。成员函数可以在类体中定义,也可以在类外定义。如果是在如果是在类外定义,类体中只写成员函数的声明,具体函数定义而在类类外定义,类体中只写成员函数的声明,具体函数定义而在类的外面进行的外面进行

28、。如。如 :class Studentprivate:int id;char name20; char major20; floatfloat fees; fees;public:void register ( ) ; /此处只做成员函数声明此处只做成员函数声明;void Student : register ( ) /成员函数的具体定义成员函数的具体定义cin id name majorfees; Logo8.3.2 在类外定义成员函数在类外定义成员函数p注意:注意:类体中定义函数时,不需要在函数名前面加上类名,因为函类体中定义函数时,不需要在函数名前面加上类名,因为函数属于哪一个类是不言而

29、喻的。数属于哪一个类是不言而喻的。成员函数在类外定义时,必须在函数名前面成员函数在类外定义时,必须在函数名前面加上类名加上类名,予以予以限定限定(qualifed),“ ”是作用域限定符是作用域限定符(field qualifier)或称作用域运算符,用它声明函数是属于哪个类的。或称作用域运算符,用它声明函数是属于哪个类的。如果在作用域运算符如果在作用域运算符“ ”的前面没有类名,或者函数名前的前面没有类名,或者函数名前面既无类名又无作用域运算符面既无类名又无作用域运算符“ ”,如,如 display( ) 或或 display( ) 则表示则表示display函数不属于任何类,这个函数不是成

30、员函数,函数不属于任何类,这个函数不是成员函数,而是全局函数,即一般普通函数。而是全局函数,即一般普通函数。Logo8.3.2 在类外定义成员函数在类外定义成员函数p注意:注意:类体中作原型声明,然后在类外定义,类体中作原型声明,然后在类外定义,类体的位置类体的位置应在函数定义之前应在函数定义之前,否则编译时会出错。,否则编译时会出错。在类的内部对成员函数作声明,而在类体外定义成在类的内部对成员函数作声明,而在类体外定义成员函数,员函数,这是程序设计的一种良好习惯。这是程序设计的一种良好习惯。Logo8.3.4 成员函数的存储方式成员函数的存储方式p用一段空间存放共同的函数代码段用一段空间存放

31、共同的函数代码段,在调用各对象的,在调用各对象的函数时,都去调用这个公用的函数代码。函数时,都去调用这个公用的函数代码。p每个对象占用的存储空间每个对象占用的存储空间只是该对象的数据部分所占只是该对象的数据部分所占用的存储空间用的存储空间,而不包括函数代码所占用的存储空间。,而不包括函数代码所占用的存储空间。Logo一个对象所占的空间大小只取决于该对象中数据成员所占的空间,一个对象所占的空间大小只取决于该对象中数据成员所占的空间,而与成员函数无关。函数代码是存储在对象空间之外的。而与成员函数无关。函数代码是存储在对象空间之外的。1.#include2.using namespace std;3

32、.class Time4.5.int hour;6.int minute;7.int sec; 8.public:9.void set( )10.cin hour minute sec;11.;12.int main()13.14. coutsizeof(Time)endl;15. return 0;16.Logo8.4 对象成员的引用对象成员的引用 在程序中经常需要访问对象中的成员。在程序中经常需要访问对象中的成员。访问对象访问对象中的成员可以有中的成员可以有3种方法:种方法: p通过对象名和成员运算符访问对象中的成员通过对象名和成员运算符访问对象中的成员;p通过指向对象的指针访问对象中的成

33、员通过指向对象的指针访问对象中的成员;p通过对象的引用变量访问对象中的成员。通过对象的引用变量访问对象中的成员。Logo8.4.1 通过对象名和成员运算符访问对象中的成员通过对象名和成员运算符访问对象中的成员访问对象中成员的一般形式访问对象中成员的一般形式:对象名对象名.成员名成员名 不仅可以在类外引用对象的公用数据成员,而且还可以调不仅可以在类外引用对象的公用数据成员,而且还可以调用对象的公用成员函数,但同样必须指出对象名,如用对象的公用成员函数,但同样必须指出对象名,如stud1. register ( ) ; /正确,调用对象正确,调用对象stud1的公用成员函数的公用成员函数regis

34、ter ( ); /错误,没有指明是哪一个对象的错误,没有指明是哪一个对象的register函数函数由于没有指明对象名,编译时把由于没有指明对象名,编译时把register()作为普通函数处理。作为普通函数处理。Logo8.4 对象成员的引用对象成员的引用只能访问只能访问public成员,而不能访问成员,而不能访问private成员,如成员,如果已定义果已定义id为私有数据成员,下面的语句是错误的:为私有数据成员,下面的语句是错误的: stud1.id=10101; /num是私有数据成员,不能被外界引用是私有数据成员,不能被外界引用 在类外只能调用公用的成员函数。在类外只能调用公用的成员函数

35、。在一个类中应当至在一个类中应当至少有一个公用的成员函数,作为对外的接口,少有一个公用的成员函数,作为对外的接口,否则就否则就无法对对象进行任何操作。无法对对象进行任何操作。Logo8.4.2 通过指向对象的指针访问对象中的成员通过指向对象的指针访问对象中的成员如果有以下程序段:如果有以下程序段: class Timepublic: /数据成员是公用的数据成员是公用的int hour;int minute;Time t,*p; /定义对象定义对象t和指针变量和指针变量pp=&t; /使使p指向对象指向对象tcouthour; /输出输出p指向的对象中的成员指向的对象中的成员hour在在p指向指

36、向t的前提下,的前提下,p-hour,(*p).hour和和t.hour三者等价。三者等价。Logo8.4.3 通过对象的引用变量来访问对象中的成员通过对象的引用变量来访问对象中的成员如果已声明了如果已声明了Time类,并有以下定义语句:类,并有以下定义语句: Time t1; /定义对象定义对象t1Time &t2=t1; /定义定义Time类引用变量类引用变量t2,并使之初始化为并使之初始化为t1coutt2.hour; /输出对象输出对象t1中的成员中的成员hourt2与与t1共占同一段存储单元共占同一段存储单元(即即t2是是t1的别名的别名),因此,因此t2.hour就是就是t1.ho

37、ur。Logo8.5类和对象的简单应用举例类和对象的简单应用举例例例8.1 最简单的例子。最简单的例子。1.#include 2.using namespace std;3.class Time 4.public: /数据成员为公用的数据成员为公用的5. int hour;6. int minute;7. int sec;8.;9.int main( )10. Time t1; /定义定义t1为为Time类对象类对象11.cint1.hour; /输入设定的时间输入设定的时间12.cint1.minute;13.cint1.sec;14.coutt1.hour:t1.minute:t1.sec

38、endl; return 0;15.Logo例例8.2 引用多个对象的成员。引用多个对象的成员。(1) 程序程序(a)1.#include 2.using namespace std;3.class Time4.public:5.int hour;6.int minute;7.int sec;8.;9.int main( )10.Time t1; /定义对象定义对象t111.cint1.hour; 12.cint1.minute;13.cint1.sec;14.coutt1.hour:t1.minute:t1.sect2.hour; /向向t2的数据成员输入数据的数据成员输入数据16.cint

39、2.minute;17.cint2.sec;18.coutt2.hour:t2.minute:t2.secendl; return 0;19.Logo例例8.2 引用多个对象的成员。引用多个对象的成员。(1) 程序程序(a)1.#include 2.using namespace std;3.class Time4.public:5.int hour;6.int minute;7.int sec;8.;9.int main( )10.11.void set_time(Time &); /函数声明函数声明12.void show_time(Time &); /函数声明函数声明13.Time t1

40、; /定义定义t1为为Time类对象类对象14.set_time(t1); 15. /调用函数,向调用函数,向t1对象中的数据成员输入数据对象中的数据成员输入数据16.show_time(t1); 17. /调用调用show_time函数,输出函数,输出t1对象中的数据对象中的数据Logo18.Time t2; /定义定义t2为为Time类对象类对象19.set_time(t2); 20.show_time(t2); 21.return 0;22.23.void set_time(Time &t) 24./定义函数定义函数set_time,形参形参t是引用变量是引用变量25.26. cint.

41、hour; /输入设定的时间输入设定的时间27. cint.minute;28. cint.sec;29.30.void show_time(Time &t) 31./定义函数定义函数show_time,形参形参t是引用变量是引用变量32.33.coutt.hour:t.minute:t.sec endl; /输出对象中的数据输出对象中的数据18.Logo例例8.3 将例将例8.2的程序改用含成员函数的类来处理。的程序改用含成员函数的类来处理。1.#include 2.using namespace std;3.class Time4.5.public:6.void set_time( );

42、/公用成员函数公用成员函数7.void show_time( ); /公用成员函数公用成员函数8.private: /数据成员为私有数据成员为私有9.int hour;10.int minute;11.int sec;12.;Logo13.int main( )14.15.Time t1; /定义对象定义对象t1 16.t1.set_time( ); 17./调用对象调用对象t1的成员函数的成员函数set_time,向向t1的数据成员输入数据的数据成员输入数据18.t1.show_time( ); 19./调用对象调用对象t1的成员函数的成员函数show_time,输出输出t1的数据成员的值的

43、数据成员的值20.Time t2; /定义对象定义对象t221.t2.set_time( ); 22.t2.show_time( ); 23.return 0;24.25.void Time set_time( ) /在类外定义在类外定义set_time函数函数26.27. cinhour;28. cinminute;29. cinsec;30.31.void Time show_time( ) /在类外定义在类外定义show_time函数函数32.33. couthour:minute:secendl;34.Logo1.1.#include #include 2.2.using namesp

44、ace std;using namespace std;3.3.class Timeclass Time4.4. 5.5. void set_time(void); void set_time(void);6.6. void show_time(void); void show_time(void);7.7. int hour; int hour;8.8. int minute; int minute;9.9. int sec; int sec;10.10.; ;11.11.Time t;Time t;12.12.int main( )int main( )13.13. 14.14. set_

45、time(); show_time(); return 0; set_time(); show_time(); return 0;15.15. 16.16.int set_time(void) int set_time(void) 17.17. 18.18. cint.hour; cint.minute; cint.sec; cint.hour; cint.minute; cint.sec;19.19. 20.20.int show_time(void) int show_time(void) 21.21. 22.22. coutt.hour:t.minute:t.secendl; coutt

46、.hour:t.minute:t.secendl;P261P261第第1 1题LogoP261P261第第2 2题P261P261第第3 3题Logo8.6 类的封装性和信息隐蔽类的封装性和信息隐蔽8.6.1 公用接口与私有实现的分离公用接口与私有实现的分离 从前面的介绍已知:从前面的介绍已知: C+通过类来实现封装性,通过类来实现封装性,把数据和与这些数据有关的操作封装在一个类中,或把数据和与这些数据有关的操作封装在一个类中,或者说,类的作用是把数据和算法封装在用户声明的抽者说,类的作用是把数据和算法封装在用户声明的抽象数据类型中。象数据类型中。 在声明了一个类以后,用户主要是通过调用公在声

47、明了一个类以后,用户主要是通过调用公用的成员函数来实现类提供的功能用的成员函数来实现类提供的功能(例如对数据成员例如对数据成员设置值,显示数据成员的值,对数据进行加工等设置值,显示数据成员的值,对数据进行加工等)。因此,因此,公用成员函数是用户使用类的公用接口公用成员函数是用户使用类的公用接口(public interface),或者说是类的对外接口或者说是类的对外接口。Logo8.6 类的封装性和信息隐蔽类的封装性和信息隐蔽 类中被操作的数据是私有的,实现的细节对用户是隐蔽的,类中被操作的数据是私有的,实现的细节对用户是隐蔽的,这种实现称为私有实现这种实现称为私有实现(private imp

48、lementation)。这种这种“类的公用接口与私有实现的分离类的公用接口与私有实现的分离”形成了信息隐蔽。形成了信息隐蔽。 软件工程的一个最基本的原则就是将接口与实现分离,软件工程的一个最基本的原则就是将接口与实现分离,信信息隐蔽是软件工程中一个非常重要的概念。它的好处在于:息隐蔽是软件工程中一个非常重要的概念。它的好处在于: (1) 如果想修改或扩充类的功能,只需修改本类中有关的数据成如果想修改或扩充类的功能,只需修改本类中有关的数据成员和与它有关的成员函数,程序中类外的部分可以不必修改。员和与它有关的成员函数,程序中类外的部分可以不必修改。(2) 如果在编译时发现类中的数据读写有错,不

49、必检查整个程序,如果在编译时发现类中的数据读写有错,不必检查整个程序,只需检查本类中访问这些数据的少数成员函数。只需检查本类中访问这些数据的少数成员函数。Logo8.6.2 类声明和成员函数定义的分离类声明和成员函数定义的分离 在面向对象的程序开发中,一般做法是将类的在面向对象的程序开发中,一般做法是将类的声明声明(其中包含成员函数的声明其中包含成员函数的声明)放在指定的头文放在指定的头文件中,用户如果想用该类,只要把有关的头文件件中,用户如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明,包含进来即可,不必在程序中重复书写类的声明,以减少工作量,节省篇幅,提高编程的效

50、率。以减少工作量,节省篇幅,提高编程的效率。 由于在头文件中包含了类的声明,因此在程由于在头文件中包含了类的声明,因此在程序中就可以用该类来定义对象。由于在类体中包序中就可以用该类来定义对象。由于在类体中包含了对成员函数的声明,在程序中就可以调用这含了对成员函数的声明,在程序中就可以调用这些对象的公用成员函数。些对象的公用成员函数。为了实现信息隐蔽,为了实现信息隐蔽,对对类成员函数的定义一般不放在头文件中,而另外类成员函数的定义一般不放在头文件中,而另外放在一个文件中。放在一个文件中。Logo8.6.2 类声明和成员函数定义的分离类声明和成员函数定义的分离例如,可以分别写例如,可以分别写两个文

51、件两个文件: /student.h (这是头文件,在此文件中进行类的声明这是头文件,在此文件中进行类的声明)class Student /类声明类声明 public:void display( ); /公用成员函数原型声明公用成员函数原型声明private:int num; char name20; char sex; ;/student.cpp /在此文件中进行函数的定义在此文件中进行函数的定义#include #include student.h /不要漏写此行,否则编译通不过不要漏写此行,否则编译通不过void Student display( ) coutnum:numendl; co

52、utname:nameendl; coutsex:sexendl; Logo8.6.2 类声明和成员函数定义的分离类声明和成员函数定义的分离 为了组成一个完整的源程序,还应当有包括主函数的源文为了组成一个完整的源程序,还应当有包括主函数的源文件:件: /main.cpp 主函数模块主函数模块#include #include student.h /将类声明头文件包含进来将类声明头文件包含进来int main( )Student stud; /定义对象定义对象 stud.display( ); /执行执行stud对象的对象的display函数函数return 0; 这是一个包括这是一个包括3个文

53、件的程序,组成两个文件模块:个文件的程序,组成两个文件模块: 一一个是主模块个是主模块main.cpp,一个是一个是student.cpp。在主模块中在主模块中又包含头文件又包含头文件student.h。在预编译时会将头文件在预编译时会将头文件student.h中的内容取代中的内容取代#include student.h行。行。Logo8.6.2 类声明和成员函数定义的分离类声明和成员函数定义的分离 请注意:请注意: 由于将头文件由于将头文件student.h放在用户当前目录中,放在用户当前目录中,因此在文件名两侧用双撇号包起来因此在文件名两侧用双撇号包起来(student.h)而不用尖而不用尖括号括号(),否则编译时会找不到此文件。否则编译时会找不到此文件。LogoLogoLogoAdd Your Company SloganThank you本章到此结束

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号