《第8章类和对象》由会员分享,可在线阅读,更多相关《第8章类和对象(53页珍藏版)》请在金锄头文库上搜索。
1、电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学第第8 8章章 类和对象类和对象8.18.1面向对象程序设计方法概述面向对象程序设计方法概述8.28.2类的声明和对象的定义类的声明和对象的定义8.38.3类的成员函数类的成员函数8.48.4对象成员的引用对象成员的引用8.58.5类的封装性和信息隐蔽类的封装性和信息隐蔽8.68.6类和对象的简单应用举例类和对象的简单应用举例啊杆矫哟丝肉侦甩盂凄询牺运促缘笑戏蹄履急蟹赡悄然饥咆森厄钩鹏购纪第8章类和对象第8章类和对象电子与信息工程系电子
2、与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学 面向过程面向过程的程序设计的程序设计:以功能为中心以功能为中心, ,采用函数来描述采用函数来描述。 面向对象程序设计面向对象程序设计(OOP) :面向对象程序设计方法认为,客观世界是由各种各样的实面向对象程序设计方法认为,客观世界是由各种各样的实体组成的,这些实体就是面向对象方法中的对象。体组成的,这些实体就是面向对象方法中的对象。消息是向某对象请求服务的一种表达方式消息是向某对象请求服务的一种表达方式对象之间的交互通过发送消息来实现。对象之间的交互通过
3、发送消息来实现。消息包括消息包括: :目标对象目标对象 , ,请求的方法请求的方法 , ,参数参数8.1 8.1 面向对象程序设计方法概述面向对象程序设计方法概述恼遭滁切寂邑牌烙佯霍说擂绸煤仪找寨尧瞒妨坤焊赫斤淆财着霞倒榷每述第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学8.1.1 8.1.1 什么是面向对象的程序设计什么是面向对象的程序设计1. 1. 对象对象 客观世界中任何一个事物都可以看成一个对象。客观世界中任何一个事物都可以看成一个对象。对象两要
4、素:对象两要素:属性属性( (attribute) ):对象的对象的静态静态特征特征行为行为( (behavior) ):对象的对象的动态动态特征,它能根据外界特征,它能根据外界给的信息进行相应的操作。给的信息进行相应的操作。一个对象是由一组属性和一组行为构成的。一个对象是由一组属性和一组行为构成的。铝拭牌蝉戍幂瞻垦妮民接叛局哟贱雪久霄喳济园庭债近营恬央气挟苞尿氢第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学图 8.1 在一个系统中的多个对象之间通过一定
5、的渠道相互在一个系统中的多个对象之间通过一定的渠道相互联系,要使某一个对象实现某一种行为联系,要使某一个对象实现某一种行为( (即操作即操作) ),应,应当向它当向它传送相应的消息传送相应的消息。对象之间就是这样通过对象之间就是这样通过发送发送和接收和接收消息互相联系的。消息互相联系的。撑鹤就日浆詹舷堑辊酱哈棺序磋至靴皮赵娱绕茂匿颐稻齐哇排芦碘涡抉驱第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学在在C+C+中,每个对象都是由数据和函数中,每个对象都是由数
6、据和函数( (即操作代码即操作代码) )这两部分组成的这两部分组成的, ,见图:见图:如三角形对象:如三角形对象:属性:它的属性:它的3 3个边长。个边长。行为:计算出三角形的面积,并且输出行为:计算出三角形的面积,并且输出调用对象中的函数就是向该对象传送一个调用对象中的函数就是向该对象传送一个消息消息(message)(message),要求该对象实现某一行为要求该对象实现某一行为( (功能功能) )。乎如疲教圾泰靡蜕挽钒榷谋秋啦砖避埔满闻斡梁稼嗣哨掷现噬兢渴朵券鲁第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPA
7、RTMENTC+C+程序设计程序设计 网网 络络 教教 学学2. 2. 封装与信息隐蔽封装与信息隐蔽“封装封装”,指两方面的含义:,指两方面的含义:将有关的数据和操作代码封装在一个对象中,形将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不干成一个基本单位,各个对象之间相对独立,互不干扰。扰。将对象中某些部分对外隐蔽,即隐蔽其内部细节,将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收外界的消只留下少量接口,以便与外界联系,接收外界的消息。息。 C+C+的对象中的函数名就是对象的对外接口,外界的对象中的函数名就是对象的对外接口,外
8、界可以通过函数名来调用这些函数来实现某些行为可以通过函数名来调用这些函数来实现某些行为( (功能功能) )。莹批查死鞭搪怎么胳皋纪脂肚平弗约鞋藤燕懦适摹挞滴整捻枕尤辞限改础第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学3. 3. 抽象抽象抽象抽象(abstraction(abstraction):有关事物的):有关事物的共性归纳、集中共性归纳、集中的过程。抽象的作用是表示同一类事物的本质。的过程。抽象的作用是表示同一类事物的本质。对象是具体存在的,如一个
9、三角形可以作为一对象是具体存在的,如一个三角形可以作为一个对象,个对象,1010个不同尺寸的三角形是个不同尺寸的三角形是1010个对象。如果个对象。如果这这1010个三角形对象有相同的属性和行为,可以将它个三角形对象有相同的属性和行为,可以将它们抽象为一种类型,称为三角形类型。在们抽象为一种类型,称为三角形类型。在C+C+中,中,这种类型就称为这种类型就称为“类类(class)”(class)”。这。这1010个三角形就个三角形就是属于同一是属于同一“类类”的对象。的对象。类是对象的抽象,而对类是对象的抽象,而对象则是类的特例,或者说是类的具体表现形式。象则是类的特例,或者说是类的具体表现形式
10、。蜕脐孵疽海绑整喇花靖奴烬菇蒙芋坠家汉铝讥屈砌小卯宗楷膀论痴朋砾赡第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学4.4.继承与重用继承与重用继承:在原有基础上增加新的内容。继承:在原有基础上增加新的内容。 例:例: 白色的马白色的马 重用:利用一个已有的类建立一个新的类,即重用:利用一个已有的类建立一个新的类,即“软件重用软件重用”思想。思想。坞谅势皑蚕锯源焙娃辣圈歧唇京署卉秧譬示机琶艰旨岛萧稗夯裤光孤宾赖第8章类和对象第8章类和对象电子与信息工程系电子
11、与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学5. 5. 多态性多态性多态性多态性: :是指允许不同类的对象对同一个消息作出是指允许不同类的对象对同一个消息作出的响应各不相同。的响应各不相同。多态性是面向对象程序设计的一个重要特征,能增多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。加程序的灵活性。变迫水锁尉收粕范蚜练鸟核草孵惺奢桨药力埋炙俱铬厕烤宝钠颖芦兢贞悼第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPAR
12、TMENTC+C+程序设计程序设计 网网 络络 教教 学学一个传统的面向过程程序设计是围绕功能进行的,一个传统的面向过程程序设计是围绕功能进行的,用一个函数实现功能。所有的数据都是公用的,一用一个函数实现功能。所有的数据都是公用的,一个函数可以使用任何一组数据,而一组数据又能被个函数可以使用任何一组数据,而一组数据又能被多个函数所使用(见图多个函数所使用(见图8.38.3)。)。8.1.28.1.2 面向对象程序设计的特点面向对象程序设计的特点图图8.3剩概譬祥迂沪恼汞怯南控爹烩衫饲圆激北肃臣幕恩搭琐掖虑很炸雍瞅滤澄第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER
13、SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学面向对象程序设计任务包括两个方面:面向对象程序设计任务包括两个方面: 一是设计所需的各种类和对象,即决定把哪些数一是设计所需的各种类和对象,即决定把哪些数据和操作封装在一起;据和操作封装在一起;二是考虑怎样向有关对象发送消息,以完成所需二是考虑怎样向有关对象发送消息,以完成所需的任务。的任务。 这时他如同一个总调度,不断地向各个对象这时他如同一个总调度,不断地向各个对象发出命令,让这些对象活动起来发出命令,让这些对象活动起来( (或者说激活这些或者说激活这些对象对象) ),完成自己职责
14、范围内的工作。各个对象的,完成自己职责范围内的工作。各个对象的操作完成了,整体任务也就完成了。操作完成了,整体任务也就完成了。拴吞魔脉恋肢炼烟颁孪窒遭锄磺嵌穴膏梗炒快驼芝暑兽淋焰渍懦钉局桅降第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学在面向过程的结构化程序设计中程序表述:在面向过程的结构化程序设计中程序表述: 程序程序= =算法数据结构算法数据结构在面向对象的结构化程序设计中程序表述:在面向对象的结构化程序设计中程序表述:对象对象 = = 算法算法 数
15、据结构数据结构 程序程序 = ( = (对象对象+ +对象对象+ +对象对象+) + +) + 消息消息或:或: 程序程序 = = 对象对象s + s + 消息消息“对象对象s”s”表示多个对象。消息的作用就是对对象表示多个对象。消息的作用就是对对象的控制。程序设计的关键是设计好每一个对象,及的控制。程序设计的关键是设计好每一个对象,及确定向这些对象发出的命令,使各对象完成相应操确定向这些对象发出的命令,使各对象完成相应操作。作。8.1.3 8.1.3 类和对象的作用类和对象的作用旷早阻卷洁纹朋焙驾柱开蹿丹谣杨编告疏怎瘦氦澜旬始蔼涵撑鸭霞鳃湛盅第8章类和对象第8章类和对象电子与信息工程系电子与
16、信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学面向对象的软件工程包括以下几个部分:面向对象的软件工程包括以下几个部分:面向对象分析面向对象分析( (object oriented analysis,OOA) ) 面向对象设计面向对象设计( (object oriented design,OOD) )面向对象编程面向对象编程( (object oriented programming, OOP) )面向对象测试面向对象测试( (object oriented test,OOT) )面向对象维护面向对象维护
17、( (object oriented soft maintenance, OOSM) )8.1.4 8.1.4 面向对象的软件开发面向对象的软件开发嫂蛾富酒捉肆遂晓局叉契秋阅众汇所掺舒拄插万堕绦渠嫩悄憾宙睦羽兼春第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学每一个实体都是对象。对象的类型称为类每一个实体都是对象。对象的类型称为类( (class) )。类是对象的抽象,而对象是类的具体实例类是对象的抽象,而对象是类的具体实例( (instance) )例如
18、:结构体类型和结构体变量的关系一样,在C+中也是先声明一个类类型,然后用它去定义若干个同类型的对象。对象就是类类型的一个变量。可以说类是对象的模板。对象就是类类型的一个变量。可以说类是对象的模板。类是抽象的,不占用内存,而对象是具体的,占用存类是抽象的,不占用内存,而对象是具体的,占用存储空间。储空间。8.2 8.2 类的声明和对象的定义类的声明和对象的定义 8.2.1 8.2.1 类和对象的关系类和对象的关系涉红单蔽每扳晚灯宵催稻曙征杠岸俐汪蝶闺姨仟御购走肺怖伤稻采拥哑霉第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY D
19、EPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学下面是声明一个结构体类型的方法:下面是声明一个结构体类型的方法: struct Student /声明了一个名为声明了一个名为Student的结构体类型的结构体类型 int num;char name20;char sex;Student stud1,stud2; /定义了两个结构体变量定义了两个结构体变量stud1stud1和和stud2stud2。它只包括数据,。它只包括数据,没有包括操作。没有包括操作。8.2.2 8.2.2 声明类类型声明类类型类是用户自己指定的类型。必须自己根据需要进行类是用户自己指定的类型。必须自己根
20、据需要进行声明,类要先声明后使用。声明,类要先声明后使用。浴镇时二崔常铃冗找裂定炯皖与暂刹熔钡辑雹绩庚精恿械唤贮愁奢答荒惩第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学现在声明一个类:现在声明一个类: class Student /以以class开头开头 int num;char name20; char sex; /以上以上3行是数据成员行是数据成员 void display( ) /这是成员函数这是成员函数coutnum:numendl;coutna
21、me:nameendl; coutsex:sexendl; ;Student stud1,stud2; 定义了定义了Student 类的对象类的对象stud1和和stud2磅漓似诫萌俯夷哲赵肘娇馆糯凄安网足滞栓嗜酉幸巍趾涛隅滥滇赎何堰霞第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学类声明的一般形式如下:类声明的一般形式如下: class class 类名类名 private: private:私有的数据和成员函数私有的数据和成员函数; ; public:
22、 public:公用的数据和成员函数公用的数据和成员函数; ; private和和public称为成员访问限定符。称为成员访问限定符。 如果在类的定义中既不指定如果在类的定义中既不指定private 或或public ,则系统就默,则系统就默认为是私有的。认为是私有的。 protected声明的成员称为受保护的成员,它不能被类外访问声明的成员称为受保护的成员,它不能被类外访问( (这点与私有成员类似这点与私有成员类似) ),但可以被派生类的成员函数访问。,但可以被派生类的成员函数访问。嘶超捞振釉旭拟右辜钟积内然婿邪谴萄淹择夜扭荫坪符枣褂谈颁瓮默嗓变第8章类和对象第8章类和对象电子与信息工程系电
23、子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学1. 1. 先声明类类型,然后再定义对象先声明类类型,然后再定义对象(1 1) class 类名类名 对象名对象名 例如:例如: class Student stud1,stud2;(2 2) 类名类名 对象名对象名 例如:例如: Student stud1,stud2;8.2.3 8.2.3 定义对象的方法定义对象的方法仲叠移扰棱案崔怖答哀驭耐墨躺芥认篆欲挡承打储圭谦涟膘秉霄催苗瞬贬第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPU
24、TER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学2. 2. 在声明类类型的同时定义对象在声明类类型的同时定义对象class Student /声明类类型声明类类型 public: /先声明公用部分先声明公用部分 void display( ) coutnum:numendl;coutname:nameendl;coutsex:sexendl; private: /后声明私有部分后声明私有部分int num;char name20; char sex; stud1,stud2; /定义了两个定义了两个Student类的对象类的
25、对象承糊惟扶蜗枝瘴歌馁安添垄浸彝塘续焉真觅嚼肢庇版众龄供否只卜砷瑰盖第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学3. 3. 不出现类名,直接定义对象不出现类名,直接定义对象class /无类名无类名private: /声明以下部分为私有的声明以下部分为私有的 public: /声明以下部分为公用的声明以下部分为公用的 stud1,stud2; /定义了两个无类名的类对象定义了两个无类名的类对象直接定义对象,在直接定义对象,在C+中是合法的、允许的,但却
26、很中是合法的、允许的,但却很少用,也不提倡用。在定义一个对象时,编译系统会为这少用,也不提倡用。在定义一个对象时,编译系统会为这个对象分配存储空间,以存放对象中的成员。个对象分配存储空间,以存放对象中的成员。刷剐莆瑚哼纲析渍狈剥翠吸螺烁肿捶暂选奶阐辆蜒擅漠功威檀稽焊宾孝粥第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学用用struct定义一个类型定义一个类型class声明的类关键字不同:关键字不同:struct数据都是公用的数据都是公用的关键字不同:关键字
27、不同:class默认为默认为private8.2.4 8.2.4 类和结构体类型的异同类和结构体类型的异同struct Studentint num;char name20;char sex;void display()coutnumendl;coutnameendl;coutsexendl;class Studentint num;char name20;char sex;void display()coutnumendl;coutnameendl;coutsexendl;公有的私有的讫爽猖持乏旗叶姜涤磅勋拟津凸拉渡桨洲势掣装修氏搐曾瞎唉咽漫铣喉单第8章类和对象第8章类和对象电子与信息工程系
28、电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学类的成员函数与一般函数的区别:类的成员函数与一般函数的区别:类的成员函数属于一个类的成员,出现在类体中。类的成员函数属于一个类的成员,出现在类体中。它可以被指定为它可以被指定为private( (私有的私有的) )、public( (公用的公用的) )或或protected( (受保护的受保护的) )。在使用类函数时,要注意调用它的在使用类函数时,要注意调用它的权限权限( (它能否被调它能否被调用用) )以及它的以及它的作用域作用域( (函数能使用什么
29、范围中的数据和函数能使用什么范围中的数据和函数函数) )。例如:私有的成员函数只能被本类中的其他成员函数所调用,而不能被类外调用。8.3 8.3 类的成员函数类的成员函数 8.3.1 8.3.1 成员函数的性质成员函数的性质蝇裸横铃妈赞简别毋轿觉阑佳愤若庄辩斡迸畏氓蟹挡地著琳罗恕贪胯描粗第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学class Student public:void display( ); /在类内声明display类函数private:
30、 int num; string name; char sex;void Student display( ) /在类外定义类函数coutnum:numendl; coutname:nameendl; coutsex:sexendl; Student stud1,stud2; /定义两个类对象8.3.2 8.3.2 在类外定义成员函数在类外定义成员函数翔戎葱心斋准巢诞口题率四辩羊啊湾辗履普滤触嚷势匝案倔踩蠢卜拿戍均第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教
31、 学学注意:注意: 在类体中直接定义函数时,函数名前不加类名在类体中直接定义函数时,函数名前不加类名 成员函数在类外定义时,必须在函数名前面加上成员函数在类外定义时,必须在函数名前面加上类名,予以限定类名,予以限定(qualifed),“ ”是作用域限定是作用域限定符符 如果函数名前面既无类名又无作用域运算符如果函数名前面既无类名又无作用域运算符“ ”,如如 : display( ) 或或 display( ) 则表示则表示display函数是全局函数,即一般普通函数。函数是全局函数,即一般普通函数。类函数在类外定义,类体的位置应在函数定义之前类函数在类外定义,类体的位置应在函数定义之前如果一
32、个函数,其函数体只有如果一个函数,其函数体只有2323行,一般可在声行,一般可在声明类时在类体中定义。明类时在类体中定义。竟攫涕穷蹈乔牙剔丫诣沈搜惮季鲍习肃着皑蟹试挽砚逆膨琶弛枷邱特鹿希第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学为了提高运行时的效率,对于较简单的函数可以为了提高运行时的效率,对于较简单的函数可以声明为内联形式(函数代码嵌入程序的调用点)声明为内联形式(函数代码嵌入程序的调用点)内联函数体中不能有复杂结构(如循环语句和内联函数体中不能有
33、复杂结构(如循环语句和switch语句)语句)在类中声明内联成员函数的方式:在类中声明内联成员函数的方式:将函数体放在类的声明中。将函数体放在类的声明中。使用使用inline关键字。关键字。8.3.3 8.3.3 inline 成员函数成员函数虑童骄设馁敞刁适日媳侨钵拘邪敬纹武缴致赖归椅亩俱泛遵沦力睫项锰考第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例例: :在类中定义内联函数。在类中定义内联函数。class Student public: void
34、display( ) /或或inline void display( ) coutnum:numendl;coutname:nameendl; coutsex:sexendl; private:int num;string name; char sex;砚记哦赂蹲侦谱骗惮知跪毡汉辰谱烷空暑喳尔襄熙瘦溺崔嗣眉颤苇祷蛋酥第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例:在类中声明、类外定义的内联成员函数例:在类中声明、类外定义的内联成员函数class Stu
35、dent public:inline void display( ); /声明此函数为内置函数声明此函数为内置函数private:int num;string name; char sex; ;inline void Student display( ) / 在类外定义内联函数在类外定义内联函数coutnum:numendl; coutname:nameendl; coutsex:sexabc;可以用下面的语句来输出该类对象所占用的字节数:coutsizeof(Time)endl;/输出值为输出值为12成员函数的存储:成员函数的存储:粪瞒抓拦念虑蛛厨欣房兢驶闹球白蹋稻豢殆握掣画还莫鹤晾工童鞍壳
36、略葫第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学 在程序中经常需要访问对象中的成员。访在程序中经常需要访问对象中的成员。访问对象中的成员可以有问对象中的成员可以有3 3种方法:种方法: 通过对象名和成员运算符访问对象中的成员通过对象名和成员运算符访问对象中的成员; ; 通过指向对象的指针访问对象中的成员通过指向对象的指针访问对象中的成员; ; 通过对象的引用变量访问对象中的成员。通过对象的引用变量访问对象中的成员。8.4 8.4 对象成员的引用对象成员
37、的引用词狠瞄畜芹公我赘蓖热赌烯钱贱帕秤拙梆罪任卧乌雄客懂峻诊湘刹猜硫椒第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学一般形式为:一般形式为:对象名对象名. .成员名成员名例如:例如:stud1.num=1001; stud1.display( ); display( ); 注意:注意:只能访问只能访问public成员,而不能访问成员,而不能访问private成员,如果成员,如果已定义已定义num为私有数据成员,下面的语句是错误的:为私有数据成员,下面的语
38、句是错误的: stud1.num=10101; /num不能被不能被外界外界引用引用 8.4.1 8.4.1 通过对象名和成员运算符访问对象中的成员通过对象名和成员运算符访问对象中的成员赔慈漠话噎寿缺稽勿锨砖券呕胳迅滨敢倡狞郑页挫恫赐莹琴厨荷雏叶胀桔第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学如果有以下程序段:如果有以下程序段: class Timepublic: /数据成员是公用的数据成员是公用的int hour;int minute;Time t,
39、*p; /定义对象定义对象t和指针变量和指针变量pp=&t; /使使p指向对象指向对象tcouthour; /输出输出p指向的对象中的成员指向的对象中的成员hour在在p指向指向t的前提下,的前提下,p-hour,(*p).hour和和t.hour三者等价。三者等价。8.4.2 8.4.2 通过指向对象的指针访问对象中的成员通过指向对象的指针访问对象中的成员抽咯潮玛隅烹诅琢跺早噬屑哼坝虫撑倚糖校夸软汤刻两孜驳曝诌蜘焉而睡第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络
40、 教教 学学如果为一个对象定义了一个引用变量,它们是共占同一段如果为一个对象定义了一个引用变量,它们是共占同一段存储单元的,实际上它们是同一个对象,可以通过引用变量来存储单元的,实际上它们是同一个对象,可以通过引用变量来访问对象中的成员。访问对象中的成员。如果已声明了如果已声明了Time类,并有以下定义语句:类,并有以下定义语句: Time t1; /定义对象定义对象t1Time &t2=t1; /定义定义TimeTime类引用变量类引用变量t2t2,并使之初始化为,并使之初始化为t1t1coutt2.hour; /输出对象输出对象t1t1中的成员中的成员hourhour由于由于t2t2与与t
41、1t1共占同一段存储单元共占同一段存储单元( (即即t2t2是是t1t1的别名的别名) ),因此,因此t2.hourt2.hour就是就是t1.hourt1.hour。8.4.3 8.4.3 通过对象的引用变量来访问对象中的成员通过对象的引用变量来访问对象中的成员t1t2石胀持骗讲碉掏造搞咆黍压钮落氟凄抵识劈溉著夷卢瘴罚柑咯渺监栅达张第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学公用成员函数公用成员函数是用户使用类的是用户使用类的公用接口公用接口( (p
42、ublic interface) ),或者说是类的,或者说是类的对外接口对外接口。通过成员函数对数据成员进行操作称为通过成员函数对数据成员进行操作称为类的实现类的实现类中被操作的数据是私有的,实现的细节对用户类中被操作的数据是私有的,实现的细节对用户是隐蔽的,这种实现称为是隐蔽的,这种实现称为私有实现私有实现( (private implementation) )。这种。这种“类的公用接口与私有实现类的公用接口与私有实现的分离的分离”形成了形成了信息隐蔽信息隐蔽。8.5 8.5 类的封装性和信息隐蔽类的封装性和信息隐蔽 8.5.1 8.5.1 公用接口与私有实现的分离公用接口与私有实现的分离伤
43、坍朽悍矛涉笆先袋疟酮护瞅择北棘姿巍漓市吸趾骆象已债昏梢哆产吻肪第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学如果将类的声明放在指定的头文件中,用户如果想如果将类的声明放在指定的头文件中,用户如果想用该类,只要把有关的头文件包含进来即可。用该类,只要把有关的头文件包含进来即可。8.5.2 8.5.2 类声明和成员函数定义的分离类声明和成员函数定义的分离例如,可以分别写两个文件:例如,可以分别写两个文件: /student.h (这是头文件,在此文件中进行类
44、的声明这是头文件,在此文件中进行类的声明)class Student /类声明类声明 public:void display( ); /公用成员函数原型声明公用成员函数原型声明private:int num; char name20; char sex; ;/student.cpp /在此文件中进行函数的定义在此文件中进行函数的定义#include #include student.h /不要漏写此行,否则编译通不要漏写此行,否则编译通不过不过void Student display( ) /在类外定义在类外定义display类函数类函数coutnum:numendl; coutname:na
45、meendl; coutsex:sexendl; /main.cpp 主函数模块主函数模块#include #include student.h /将类声明头文件包含进来将类声明头文件包含进来int main( )Student stud; /定义对象定义对象stud.display( ); /执行执行stud对象的对象的display函数函数return 0;行鸵穗谆激篱耽橇玻仔拱卸卸谚弯土限满昂法能压襟蜡充渔吝草搜烫址曝第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网
46、络络 教教 学学注意:注意: 由于将头文件由于将头文件student.hstudent.h放在用户当前目录中,因此在文放在用户当前目录中,因此在文件名两侧用双撇号包起来件名两侧用双撇号包起来(student.h) (student.h) ,否则编译时,否则编译时会找不到此文件。会找不到此文件。图8.6姬资袍诫氧摆街御嗅胜瑶袁穷何棋岛掣只峪忍京砸伤棘设珊蒲谓恶渝抉躬第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学成员函数的定义不放在头文件。成员函数的定义不放
47、在头文件。若干个常用的功能相近的类声明集中在一起,形成类库。若干个常用的功能相近的类声明集中在一起,形成类库。类库有两种:类库有两种: 标准类库和用户类库。类库包括两个组成部标准类库和用户类库。类库包括两个组成部分:分: (1) (1)类声明头文件;类声明头文件; (2) (2)已经过编译的成员函数的定义,它是目标文件。用户已经过编译的成员函数的定义,它是目标文件。用户只需把类库装入到自己的计算机系统中只需把类库装入到自己的计算机系统中( (一般装到一般装到C+C+编译编译系统所在的子目录下系统所在的子目录下) ),并在程序中用,并在程序中用#include#include命令行将有命令行将有
48、关的类声明的头文件包含到程序中,就可以使用这些类和关的类声明的头文件包含到程序中,就可以使用这些类和其中的成员函数,顺利地运行程序。其中的成员函数,顺利地运行程序。在用户程序中包含类声明头文件,类声明头文件就成为用在用户程序中包含类声明头文件,类声明头文件就成为用户使用类的公用接口户使用类的公用接口捂浓荣濒泊舒称铆漠异瞅讨棉丹掺匆译析辗模嚏访尧歌挎傅浊蚌丙曲谩巡第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例例8.1 最简单的例子。最简单的例子。#inc
49、lude using namespace std;class Time /定义定义Time类类public: /数据成员为公用的数据成员为公用的 int hour; int minute; int sec;8.6 8.6 类和对象的简单应用举例类和对象的简单应用举例int main( ) Time t1; /定义定义t1为为Time类对象类对象cint1.hour; /输入设定的时间输入设定的时间cint1.minute;cint1.sec;coutt1.hour:t1.minute:t1.secendl; /输出时间输出时间return 0;喘咏芍负娠忱柿涛撩示属派橡狱收陪浴轰钓错批前结贯邯
50、莫疽牡仁碾朔权第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学运行情况如下:运行情况如下: 12 32 43 12:32:43注意:注意:(1) (1) 在引用数据成员在引用数据成员hour,minute,sec时不要忘记在前面时不要忘记在前面指定对象名。指定对象名。(2) (2) 不要错写为类名不要错写为类名,如写成,如写成Time.hour,Time.minute,Time.sec是不对的。因为类是一种抽象的数据类型,并不是是不对的。因为类是一种抽象的
51、数据类型,并不是一个实体,也不占存储空间,而对象是实际存在的实体,一个实体,也不占存储空间,而对象是实际存在的实体,是占存储空间的,其数据成员是有值的,可以被引用的。是占存储空间的,其数据成员是有值的,可以被引用的。(3) (3) 如果删去主函数的如果删去主函数的3个输入语句,即不向这些数据成员个输入语句,即不向这些数据成员赋值,则它们的值是不可预知的。赋值,则它们的值是不可预知的。慌擂除接猴箱济畅炔淘笔脚盲瘁坷导叫愈鹤群吸已挽苑旧缎摩憋保顶肄调第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程
52、序设计程序设计 网网 络络 教教 学学例例8.2 引用多个对象的成员。引用多个对象的成员。(1) 程序程序(a)#include using namespace std;class Timepublic:int hour;int minute;int sec;int main( )Time t1; /定义对象定义对象t1cint1.hour; cint1.minute;cint1.sec;coutt1.hour:t1.minute:t1.sect2.hour; cint2.minute;cint2.sec;coutt2.hour:t2.minute:t2.secendl; return 0;运
53、行情况如下:运行情况如下: 10 32 43 10:32:4322 32 43 22:32:43滔快卯肖撬惜秋梳刁晋钝位盲愿勒阔养懈廓蔚犬渊蝴勾疚轧疾惟酞剿钢龋第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学(2) 程序程序(b)#include using namespace std;class Timepublic:int hour;int minute;int sec;int main( )void set_time(Time&); void sho
54、w_time(Time&); Time t1; set_time(t1); show_time(t1); Time t2; set_time(t2); show_time(t2); return 0;void set_time(Time& t) cint.hour; cint.minute; cint.sec;void show_time(Time& t) coutt.hour:t.minute:t.secendl;运行情况与程序运行情况与程序(a)相同。相同。编惯逼海惮舰题把香峪汕陷躲趴辖驻聂必妥饵隔页宴浚稠恃蒜寇幼目淫侯第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPU
55、TER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学(3) 程序程序(c)int main( ) void set_time(Time&,int hour=0,int minute=0,int sec=0); void show_time(Time&); Time t1;set_time(t1,12,23,34); show_time(t1);Time t2;set_time(t2); /普通函数调用,无初始值使用默认参数普通函数调用,无初始值使用默认参数 show_time(t2);return 0;导捻嗜系捧替刨星叫果晌卷闷
56、坍仇椿嗓苍怪具笔蛛宗郴烯琢碳份蔗己梯滇第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学void set_time(Time& t,int hour,int minute,int sec) t.hour=hour;t.minute=minute;t.sec=sec;void show_time(Time& t)coutt.hour:t.minute:t.secendl;程序运行时的输出为:程序运行时的输出为:12:23:34 (t1中的时、分、秒中的时、分、
57、秒)0:0:0 (t2中的时、分、秒中的时、分、秒) 以上两个程序中定义的类都只有数据成员,没有成员函数,以上两个程序中定义的类都只有数据成员,没有成员函数,这显然没有体现出使用类的优越性。在下面的例子中,类这显然没有体现出使用类的优越性。在下面的例子中,类体中就包含了成员函数。体中就包含了成员函数。仙承鸥惰抵沾恼佯忌峻益锹胰日邯峙蓟滓曝鸵苑巩钧蹬彝旨划薛溢涩授膜第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学例例8.3 将例将例8.2的程序改用含成员函数
58、的类来处理。的程序改用含成员函数的类来处理。#include using namespace std;class Timepublic:void set_time( ); /公用成员函数公用成员函数void show_time( ); /公用成员函数公用成员函数 private: /数据成员为私有数据成员为私有int hour;int minute;int sec;仍远坪讳孙槽氖遵坏剃颠窗柳天舟泳筒澎馋凶犯撬炒迫玩焉藻扎伶陷葡围第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网
59、网 络络 教教 学学int main( )Time t1; /定义对象定义对象t1 t1.set_time( ); /调用对象调用对象t1的成员函数的成员函数set_time,输入数据,输入数据t1.show_time( ); /调用对象调用对象t1的成员函数的成员函数show_time,输出数据,输出数据Time t2; /定义对象定义对象t2t2.set_time( ); /调用对象调用对象t2的成员函数的成员函数set_time,输入数据,输入数据t2.show_time( ); /调用对象调用对象t2的成员函数的成员函数show_time,输出数据,输出数据return 0;昼涌圆涯揩
60、若厕撤考驳鲜俐蛔揪当搬靡每级恼犹彪耽与视夯猎谎锦崩岩苟第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学void Time set_time( ) /在类外定义在类外定义set_timeset_time函数函数 cinhour; cinminute; cinsec;void Time show_time( ) /在类外定义在类外定义show_timeshow_time函数函数 couthour:minute:secendl;运行情况与例运行情况与例8.28.
61、2中的程序中的程序(a)(a)相同。相同。橱烙惰寨舷伎磊夜酥守枣壶过着繁兔疙舜攘甚全螟耕村彪晒肄悸释槐涎众第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学注意:注意: (1)(1)在主函数中调用两个成员函数时,应指明对象在主函数中调用两个成员函数时,应指明对象名名(t1,t2)(t1,t2)。 (2)(2)在类外定义函数时,应指明函数的作用域在类外定义函数时,应指明函数的作用域( (如如void Time set_time( )。在成员函数引用本对。在成员
62、函数引用本对象的数据成员时,只需直接写数据成员名,这象的数据成员时,只需直接写数据成员名,这时时C+C+系统会把它默认为本对象的数据成员。也系统会把它默认为本对象的数据成员。也可以显式地写出类名并使用域运算符。可以显式地写出类名并使用域运算符。(3) (3) 应注意区分什么场合用域运算符应注意区分什么场合用域运算符“”“”,什么,什么场合用成员运算符场合用成员运算符“.”“.”,不要搞混。,不要搞混。晰簇赃陕甄阻咕袒痈颗盘恼睦女碧椽刁逗蜒忻导将诵戳微灰底辰抡池聪继第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPART
63、MENTC+C+程序设计程序设计 网网 络络 教教 学学例例8.4 找出一个整型数组中的元素的最大值。找出一个整型数组中的元素的最大值。#include using namespace std;class Array_max /声明类声明类public: /以下以下3行为成员函数原型声行为成员函数原型声明明void set_value( ); /对数组元素设置值对数组元素设置值void max_value( ); /找出数组中的最大元素找出数组中的最大元素void show_value( ); /输出最大值输出最大值private:int array10; /整型数组整型数组int max;
64、/max用来存放最大值用来存放最大值;审拭妒谅立狗蹬誉赋浚敦滓像屑来罐最渺宴房气唱金阀拴绝春护营平券辗第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学void Array_max set_value( ) int i; for (i=0;iarrayi;void Array_max max_value( ) int i;max=array0;for (i=1;imax) max=arrayi;腺焊鸳锻哀路尿跟淑瓤呀陪撬枣肤躺嘴兼区顿挣榨啸牛于沈炮客舱仕度猾
65、第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学void Array_max show_value( ) coutmax=max;int main( )Array_max arrmax; /定义对象定义对象arrmaxarrmax.set_value( ); /向数组元素输入数值向数组元素输入数值arrmax.max_value( ); /找出数组元素中的最大找出数组元素中的最大值值arrmax.show_value( ); /输出数组元素中的最大值输出数
66、组元素中的最大值return 0;运行结果如下:运行结果如下: 12 12 39 -34 17 134 045 -91 76 (输入输入10个元素的值个元素的值)max=134 (输出输出10个元素中的最大值个元素中的最大值)荆惯盼剧恰岿肯佑泽抑猴优埋耍轰烈软穗旭闷刽灰顾痴虱呕棋乙雕糕辛皿第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学编程特点:编程特点: 主函数很简单,语句很少,只是调用有关对象主函数很简单,语句很少,只是调用有关对象的成员函数,去完成相
67、应的操作。的成员函数,去完成相应的操作。 主函数中甚至不出现控制结构,而在成员函数主函数中甚至不出现控制结构,而在成员函数中使用控制结构。中使用控制结构。 最关键的工作是最关键的工作是类的设计类的设计。所有的数据和对数。所有的数据和对数据的操作都体现在类中。只要把类定义好,编写程据的操作都体现在类中。只要把类定义好,编写程序的工作就显得很简单了。序的工作就显得很简单了。岂秸歇苔刻矫泼丁维经矾煮织甥呻酋狼置从椭劳营牢株舜蔗桌巳铀绒凌磊第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计
68、 网网 络络 教教 学学作业:16实验:实验9疑织离佣娟豌候猛夫菏姻豫逃棉诈摧不裹捻觉间汲三叮篆伦命嘻镊硫级换第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学上机实验报告的内容要求:上机实验报告的内容要求:1 1、实验题目、实验题目2 2、实验目的、实验目的3 3、源代码、源代码4 4、运行结果、运行结果5 5、上机体会、上机体会说明说明: :其中其中1 1,2 2,4 4,5 5电子文档提交使用注释电子文档提交使用注释施庶尚帜妹喘卿铃舅穗捎胆暮仑拘签坤庞疾劳珐抄役倦勉抿判尸罩铝泵剥第8章类和对象第8章类和对象电子与信息工程系电子与信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTC+C+程序设计程序设计 网网 络络 教教 学学学好程序设计语言的唯一途径是学好程序设计语言的唯一途径是 上机练习。上机练习。你的编程能力与你在计算机上投入的时你的编程能力与你在计算机上投入的时间成间成 正比。正比。希淘肤啦泊扔隆滚赃尺板坯壳晴庭另唱撅宇荣痪欣荧戍皆撩豪抓渺堕歼漫第8章类和对象第8章类和对象