《面向对象程序设计之类和对象精选PPT.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计之类和对象精选PPT.ppt(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、关于面向对象程序设关于面向对象程序设计之类和对象计之类和对象现在学习的是第1页,共56页C+2-2 2.1 面向对象程序设计方法概述面向对象程序设计方法概述l什么是面向对象的程序设计什么是面向对象的程序设计?面向对象的程序设计面向对象的程序设计(Object-Oriented Programming)和传统的结构化程序设计的思路完全不同。和传统的结构化程序设计的思路完全不同。面向对象的程序设计和人们面向对象的程序设计和人们日常生活解决问题日常生活解决问题的思路是相似的。的思路是相似的。比如,我们生产汽车时,不是顺序制造发动机,在设计制造底盘、车比如,我们生产汽车时,不是顺序制造发动机,在设计制
2、造底盘、车身、轮子。而是分别设计制造发动机、底盘、车身和轮子,最后组身、轮子。而是分别设计制造发动机、底盘、车身和轮子,最后组装在一起。组装时,各部件之间有联系,以便协调工作。例如,司装在一起。组装时,各部件之间有联系,以便协调工作。例如,司机踩油门,就能调节油路,控制发动机的转速,就能驱动车轮。机踩油门,就能调节油路,控制发动机的转速,就能驱动车轮。现在学习的是第2页,共56页C+2-3 2.1 面向对象程序设计方法概述面向对象程序设计方法概述程序设计者的程序设计者的任务有两个任务有两个:一是设计所需要的类和对象,即确定那些数据和操作:一是设计所需要的类和对象,即确定那些数据和操作封装封装在
3、一起;在一起;(类设计者、核心模块产品提供商类设计者、核心模块产品提供商)二是考虑怎样向有关对象发送二是考虑怎样向有关对象发送消息消息,以启动相关对象的操作。,以启动相关对象的操作。(主程序设计者,外包程序,面向用户的公司)(主程序设计者,外包程序,面向用户的公司)编程者如同一个总调度,不断地向各个对象发出命令,让这些对象活编程者如同一个总调度,不断地向各个对象发出命令,让这些对象活动起来,完成指定的工作。动起来,完成指定的工作。这就是面向对象的程序设计的基本思路。这就是面向对象的程序设计的基本思路。现在学习的是第3页,共56页C+2-4 2.1 面向对象程序设计方法概述面向对象程序设计方法概
4、述l什么是对象什么是对象(object)?一个对象由一组一个对象由一组“属性属性”和一组和一组“行为行为”构成。并根据外界给它的消息进构成。并根据外界给它的消息进行相应的操作。系统中多个对象通过一定的渠道相互联系。行相应的操作。系统中多个对象通过一定的渠道相互联系。任何任何事物事物都可以看成一个对象。可以是自然物体,也可以是逻辑结构。都可以看成一个对象。可以是自然物体,也可以是逻辑结构。例:例:一个班级作为对象一个班级作为对象一个班级作为对象,有两个要素:一是班级的静态特征,如班级所属的专业一个班级作为对象,有两个要素:一是班级的静态特征,如班级所属的专业,学生人数、班主任姓名等,这种静态特征
5、称为,学生人数、班主任姓名等,这种静态特征称为“属性属性”;另一个是班级;另一个是班级的动态特征,如上课,体育比赛,开会等,称为的动态特征,如上课,体育比赛,开会等,称为“行为行为”。外界向班级发。外界向班级发一个信息(如上课铃声,广播通知),我们称之为一个信息(如上课铃声,广播通知),我们称之为“消息消息”,班级就会发,班级就会发生一个操作(要么上课,要么开会)生一个操作(要么上课,要么开会)现在学习的是第4页,共56页C+2-5 2.1 面向对象程序设计方法概述面向对象程序设计方法概述l什么是什么是C+对象?对象?C+中,每个对象都由若干中,每个对象都由若干数据(属性)数据(属性)和若干和
6、若干函数(操作行为)函数(操作行为)组成。数据就是对象的组成。数据就是对象的“属性属性”,函数就是用来对数据进行的,函数就是用来对数据进行的“操操作作”,以便实现某种功能。这种操作就是对象的,以便实现某种功能。这种操作就是对象的“行为行为”,也叫,也叫“方法方法”。我们点击一下鼠标,按动键盘的一个按钮,就是给某个对象一个消我们点击一下鼠标,按动键盘的一个按钮,就是给某个对象一个消息,系统回调用该对象中的函数进行操作。息,系统回调用该对象中的函数进行操作。比如长方形对象,其长和宽就是它的属性,调用该对象的一些函数,比如长方形对象,其长和宽就是它的属性,调用该对象的一些函数,即向该对象传送一些消息
7、,可以用来对其长、宽值进行加工计算,以即向该对象传送一些消息,可以用来对其长、宽值进行加工计算,以实现求出面积、周长等功能。实现求出面积、周长等功能。现在学习的是第5页,共56页C+2-6 2.1 面向对象程序设计方法概述面向对象程序设计方法概述l什么是对象封装什么是对象封装(encapsulation)?就是把对象的不想让外界知道的属性和功能屏蔽起来,让外界看不见。封就是把对象的不想让外界知道的属性和功能屏蔽起来,让外界看不见。封装有两个含义,装有两个含义,一是将有关的数据和操作函数封装成一个基本单位,即对象内。各对象之一是将有关的数据和操作函数封装成一个基本单位,即对象内。各对象之间间相互
8、独立,互不干扰相互独立,互不干扰;二是将对象中的部分属性或功能二是将对象中的部分属性或功能对外隐蔽对外隐蔽,只留少数接口向外公布,以接,只留少数接口向外公布,以接收外界信息。收外界信息。对象封装的好处在于,降低了人们操作对象的复杂程度。使用对象的人,不对象封装的好处在于,降低了人们操作对象的复杂程度。使用对象的人,不必知道对象内部的实现细节,只需要了解外部功能就可以自如地操作该对必知道对象内部的实现细节,只需要了解外部功能就可以自如地操作该对象。象。对象的行为由类的内部数据结构和相关的操作确定;外部行为通过操作接对象的行为由类的内部数据结构和相关的操作确定;外部行为通过操作接口实现。人们关心的
9、就是操作接口(函数名)所能提供的服务。口实现。人们关心的就是操作接口(函数名)所能提供的服务。现在学习的是第6页,共56页C+2-7 2.1 面向对象程序设计方法概述面向对象程序设计方法概述l什么是抽象什么是抽象(abstraction)?将具有相同特性的事物归纳、集中成一个统一类型,称为将具有相同特性的事物归纳、集中成一个统一类型,称为抽象抽象。比如,把张三,李四,王五归纳为一类,我们称之为。比如,把张三,李四,王五归纳为一类,我们称之为“人人”。抽象的作用,是表示同类事物的抽象的作用,是表示同类事物的本质本质。C和和C+中,中,数据类型数据类型就是对一批具体数据的抽象,整形数据就是所有整数
10、的抽象。就是对一批具体数据的抽象,整形数据就是所有整数的抽象。“类类”是是“对象对象”的抽象,的抽象,“对象对象”则是类的则是类的“特例特例”,或,或“具体表现形式具体表现形式”。现在学习的是第7页,共56页C+2-8 2.1 面向对象程序设计方法概述面向对象程序设计方法概述l什么是继承什么是继承(inherit)?B类在类在A类的基础上增加了少量内容。我们显然不必重新设计一个新类类的基础上增加了少量内容。我们显然不必重新设计一个新类B,只需要把,只需要把A类拿过来,在此基础上添加新内容就可以了。这就是面向对象程类拿过来,在此基础上添加新内容就可以了。这就是面向对象程序设计的序设计的继承机制继
11、承机制。C+提供继承机制,大大节省了编程工作量,这就是所谓提供继承机制,大大节省了编程工作量,这就是所谓“软件重用软件重用(software reusability)”的思想。对于大型软件的开发具有重要意义。的思想。对于大型软件的开发具有重要意义。现在学习的是第8页,共56页C+2-9 2.1 面向对象程序设计方法概述面向对象程序设计方法概述l什么是多态性什么是多态性(polymorphism)?如果有几个如果有几个相似而不同相似而不同的对象,人们往往要求在向它们发出的对象,人们往往要求在向它们发出同一个消息同一个消息时,各自作出时,各自作出不同的操作不同的操作,这种情况就是,这种情况就是“多
12、态现象多态现象”。C+中,所谓多态性是指,由中,所谓多态性是指,由继承而产生继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。的相关的不同的类,其对象对同一消息会作出不同的响应。显然,多态性能增加程序的灵活性,它是面向对象程序设计的重要特征。显然,多态性能增加程序的灵活性,它是面向对象程序设计的重要特征。现在学习的是第9页,共56页C+2-10 2.1 面向对象程序设计方法概述面向对象程序设计方法概述l类与对象的作用类与对象的作用C+全面支持传统的面向过程的程序设计(即结构化编程),也支持基全面支持传统的面向过程的程序设计(即结构化编程),也支持基于对象和面向对象的程序设计。于对象
13、和面向对象的程序设计。所谓所谓基于基于对象,是指程序是以类和对象为基础,程序的操作是围绕对象对象,是指程序是以类和对象为基础,程序的操作是围绕对象进行的。进行的。所谓所谓面向面向对象,是指,在基于对象的基础上,利用了继承机制和多态性。对象,是指,在基于对象的基础上,利用了继承机制和多态性。l面向对象的程序设计特点面向对象的程序设计特点:类具有对数据的抽象性、封装性、继承性、多态性。类具有对数据的抽象性、封装性、继承性、多态性。现在学习的是第10页,共56页C+2-11 2.2 类的声明和对象的定义类的声明和对象的定义l类和对象的关系类和对象的关系C+中,中,对象的类型称为类对象的类型称为类(c
14、lass)。类代表了某一批对象的共同特性。前面已经谈到,。类代表了某一批对象的共同特性。前面已经谈到,类是对象的抽象,而对象是类的具体实例类是对象的抽象,而对象是类的具体实例(instance)。就象结构体类型和结构体变量一样。就象结构体类型和结构体变量一样。C+中,我们先中,我们先声明一个类的类型,然后再定义该类的若干对象。对象就是类这种类型的声明一个类的类型,然后再定义该类的若干对象。对象就是类这种类型的一个变量。一个变量。类是抽象的,不占内存,而对象是具体的,要占用内存空间类是抽象的,不占内存,而对象是具体的,要占用内存空间。现在学习的是第11页,共56页C+2-12 2.2 类的声明和
15、对象的定义类的声明和对象的定义l类的声明类的声明类的声明方法和结构体的声明方法一样,只是将关键字类的声明方法和结构体的声明方法一样,只是将关键字struct 换成换成class:class 类名类名 private:私有数据成员和私有私有数据成员和私有成员函数成员函数;public:公共数据成员和公共公共数据成员和公共成员函数成员函数;/成员访问限定区域先后次序任意,但一种最好只出现一次成员访问限定区域先后次序任意,但一种最好只出现一次,类的成员包含对数据操作的函数,体现了数据和操作的封装类的成员包含对数据操作的函数,体现了数据和操作的封装类的成员不能所有都私有,一般隐藏数据,把成员函数作为对
16、外接口类的成员不能所有都私有,一般隐藏数据,把成员函数作为对外接口成员访问限定符(member access specifier)成员访问限定符(member access specifier)别忘了必须用分号结束!现在学习的是第12页,共56页C+2-13 2.2 类的声明和对象的定义类的声明和对象的定义l类的声明示例类的声明示例类头:类头:class rectangle 类体:类体:private:int length,width,area,perimeter;public:void PutArea()area=length*width;void PutPerimeter()perimet
17、er=(length+width)*2;void display()cout “length=“length endl;cout “width=“width endl;cout “area=“area endl;cout “perimeter=“perimeter endl;在类的外面不能访问私有成员,只能通过公有成员函数间接访问在类的外面可以访问公有成员不指定公有私有,则默认为私有不指定公有私有,则默认为私有一般先出现一般先出现private,后出现,后出现public现在学习的是第13页,共56页C+2-14 类的声明类的声明l还有一种还有一种protected类型,不能被类外访问,但可以
18、被类型,不能被类外访问,但可以被派生类访问派生类访问l一般使用厂商提供的类库一般使用厂商提供的类库l也可以自定义类库,便于单位部门使用也可以自定义类库,便于单位部门使用现在学习的是第14页,共56页C+2-15 2.2 类的声明和对象的定义类的声明和对象的定义l对象的定义对象的定义 声明了类以后,就可以定义该类的对象了。给对象分配了存储空间。声明了类以后,就可以定义该类的对象了。给对象分配了存储空间。其格式为:其格式为:class 类名类名 对象名对象名1,对象名,对象名2,/方括号表示可选项方括号表示可选项l对象定义示例对象定义示例 如前例中,声明了一个名为如前例中,声明了一个名为 rect
19、angle 的类,我们可以定义该类的若干对象:的类,我们可以定义该类的若干对象:class rectangle r1,r2,r3;rectangle r1,r2,r3;现在学习的是第15页,共56页C+2-16 2.2 类的声明和对象的定义类的声明和对象的定义l对象定义对象定义class rectangle private:int length,width,area,perimeter;public:void PutArea()area=length*width;void PutPerimeter()perimeter=(length+width)*2;void display()cout “
20、length=“length endl;cout “width=“width endl;cout “area=“area endl;cout “perimeter=“perimeter endl;r1,r2;l不出现类名,直接定义对象,不提倡不出现类名,直接定义对象,不提倡现在学习的是第16页,共56页C+2-17 2.2 类的声明和对象的定义类的声明和对象的定义l类和结构体类型异同类和结构体类型异同 struct/class rectangle public/private:int length,width,area,perimeter;void PutArea()area=length*w
21、idth;void PutPerimeter()perimeter=(length+width)*2;void display()cout “length=“length endl;cout “width=“width endl;cout “area=“area endl;cout “perimeter=“perimeter endl;r1,r2;l建议使用建议使用CLASS现在学习的是第17页,共56页C+2-18 2.3 类的成员函数类的成员函数l成员函数的性质成员函数的性质类的成员函数也叫类函数,用法和一般函数基本上一样。区别在于类的成员函数也叫类函数,用法和一般函数基本上一样。区别在于
22、它只是属于一个类的成员而出现在类中。它可以被指定为类的私它只是属于一个类的成员而出现在类中。它可以被指定为类的私有成员有成员(private)、公有成员、公有成员(public)或保护成员或保护成员(protected)。使用类函数时,要注意它的使用权限,如果是私有成员,只能被本类的使用类函数时,要注意它的使用权限,如果是私有成员,只能被本类的其他成员函数调用,不能被类外调用(其他成员函数调用,不能被类外调用(工具函数工具函数)。成员函数可以调用)。成员函数可以调用本类所有数据成员和成员函数,也可以引用在本作用域中的有效数据。本类所有数据成员和成员函数,也可以引用在本作用域中的有效数据。通常,
23、我们把类的数据成员定义成通常,我们把类的数据成员定义成私有私有成员,对外屏蔽,而把成员函数定义成成员,对外屏蔽,而把成员函数定义成公有公有成员,他可以调用私有成员和其它成员。成员,他可以调用私有成员和其它成员。一个类若没有成员函数,就退化成一个类若没有成员函数,就退化成C语言的结构体,而失去意义。语言的结构体,而失去意义。现在学习的是第18页,共56页C+2-19 2.3 类的成员函数类的成员函数l在类外定义成员函数在类外定义成员函数成员函数一般在类体中定义,如前面所讲。也可以在类外定义,但成员函数一般在类体中定义,如前面所讲。也可以在类外定义,但要指明是属于哪个类的成员函数,用要指明是属于哪
24、个类的成员函数,用“类名类名:函数名函数名”来指定。例如:来指定。例如:class rectangle private:int length,width,;int area,perimeter;public:void PutArea();void PutPerimeter();void display();void rectangle:PutArea()area=length*width;void rectangle:PutPerimeter()perimeter=(length+width)*2;void rectangle:display()cout “length=“length end
25、l;cout “width=“width endl;cout “area=“area endl;cout “perimeter=“perimeter;rectangle r1,r2,r3;现在学习的是第19页,共56页C+2-20“:”成为域限定符。如果在域限定符前没有类名,或函数名前既没有类名,成为域限定符。如果在域限定符前没有类名,或函数名前既没有类名,又没有域限定符:又没有域限定符::display()或或 display()则表示该函数不属于任何类,它不是成员函数,而是全局函数则表示该函数不属于任何类,它不是成员函数,而是全局函数,即普通函数。,即普通函数。现在学习的是第20页,共56
26、页C+2-21 一般来说,类定义包括两个部分:一般来说,类定义包括两个部分:1、声明部分、声明部分(“做什么做什么”):数据成员数据成员(名称、类型名称、类型)成员函数成员函数(方法方法)2、实现部分、实现部分(“怎么做怎么做”):成员函数的定义和实现成员函数的定义和实现声明在定义之前,也即是类体外定义成员函声明在定义之前,也即是类体外定义成员函数(这里用定义,实际是给函数分配了空间数(这里用定义,实际是给函数分配了空间,后章节详述),后章节详述)减小了类体长度,隐藏了执行细节,提高了类的减小了类体长度,隐藏了执行细节,提高了类的保密性保密性现在学习的是第21页,共56页C+2-22 2.3
27、类的成员函数类的成员函数inline 成员函数成员函数类的成员函数也可以指定为内联函数,只要是函数代码较少,有频繁使类的成员函数也可以指定为内联函数,只要是函数代码较少,有频繁使用。我们只要在成员函数的类型签名加上用。我们只要在成员函数的类型签名加上inline 关键字就可以。关键字就可以。lclass rectangle l private:l int length,width,;l int area,perimeter;l public:l inline void PutArea();l inline void PutPerimeter();l void display()cout “le
28、ngth=“length endl;cout “width=“width endl;cout “area=“area endl;cout “perimeter=“perimeter endl;现在学习的是第22页,共56页C+2-23 2.3 类的成员函数类的成员函数inline 成员函数成员函数class rectangle l private:l int length,width,;l int area,perimeter;l public:l inline void PutArea();l inline void PutPerimeter();l void display();l;voi
29、d rectangle:display()cout “length=“length endl;cout “width=“width endl;cout “area=“area endl;cout “perimeter=“perimeter;Inline现在学习的是第23页,共56页C+2-24 2.3 类的成员函数类的成员函数inline 成员函数成员函数类体中不包含循环控制结构,此类成员函数自动作为类体中不包含循环控制结构,此类成员函数自动作为inline 成员函数。成员函数。类体外也可定义类体外也可定义inline 成员函数,声明、定义其一显式定义即可,类定义和其成员函数定义必成员函数,声
30、明、定义其一显式定义即可,类定义和其成员函数定义必须在同一文件(或包含)。须在同一文件(或包含)。现在学习的是第24页,共56页C+2-25 2.3 类的成员函数类的成员函数l成员函数的存储方式成员函数的存储方式同一类定义了多个对象时,每个对象的同一类定义了多个对象时,每个对象的数据成员数据成员各自占据独立的空间,而共享一个共用的各自占据独立的空间,而共享一个共用的函数代码段函数代码段,不占用对象的存储空间。,不占用对象的存储空间。C+为此专门设立了一个名为为此专门设立了一个名为 this 的指针,用来指向不同的对象。当调用对象的指针,用来指向不同的对象。当调用对象r1,成员函数访问的就是,成
31、员函数访问的就是r1的的数据数据成员。所以成员函数建议在类体外定义。成员。所以成员函数建议在类体外定义。数据数据1对象对象r1数据数据2对象对象r2数据数据10对象对象r10共用函数代码共用函数代码现在学习的是第25页,共56页C+2-26 2.4 对象成员的引用对象成员的引用l用对象名和成员运算符用对象名和成员运算符(.)访问对象成员访问对象成员举例:举例:class rectangle public:int length,width;/公共数据成员公共数据成员 void display();/公共成员函数公共成员函数;void rectangle:display()cout“area=“l
32、ength*width ednl;cout“perimeter=“lengthclass rectangle public:int length,width;/公共数据成员公共数据成员 void display();/公共成员函数公共成员函数;void rectangle:display()cout“area=“length*width ednl;cout“perimeter=“lenght=5;p-width=4;p-display();用这种方式万分的成员,也必须定义成公用成员!用这种方式万分的成员,也必须定义成公用成员!现在学习的是第27页,共56页C+2-28 2.4 对象成员的引用对
33、象成员的引用l用对象的引用访问对象成员用对象的引用访问对象成员举例举例:class rectangle public:int length,width;/公共数据成员公共数据成员 void display();/公共成员函数公共成员函数;void rectangle:display()cout“area=“length*width ednl;cout“perimeter=“(length+width)*2;void main()rectangle r2;rectangle&r3=r2;r3.lenght=5;r3.width=4;r3.display();现在学习的是第28页,共56页C+2-
34、29 例例l定义一个时间类,并定义一个对象及其引用,输入时分秒输出时:分:秒定义一个时间类,并定义一个对象及其引用,输入时分秒输出时:分:秒l#include lusing namespace std;lint main()l Time t1;l cint2.hour;l cint2.minute;l cint1.sec;l coutt1.hour:t1.minute:t2.secendl;l l 现在学习的是第29页,共56页C+2-30 例例l#include lusing namespace std;lclass Timel public:l int hour;l int minute;
35、l int sec;l;lint main()l Time t1;l Time&t2=t1;l cint2.hour;l cint2.minute;l cint1.sec;l coutt1.hour:t1.minute:t2.secendl;l l 现在学习的是第30页,共56页C+2-31 例例l定义定义2个对象,分别输入时分秒输出时:分:秒个对象,分别输入时分秒输出时:分:秒l#include lclass Timel public:l int hour;l int minute;l int sec;l;lint main()l return 0;l 现在学习的是第31页,共56页C+2-
36、32 例例l#include lusing namespace std;lclass Timel public:l int hour;l int minute;l int sec;l;lint main()l Time t1;l cint1.hour;l cint1.minute;l cint1.sec;l coutt1.hour:t1.minute:t1.sect2.hour;l cint2.minute;l cint2.sec;l coutt2.hour:t2.minute:t2.secendl;l return 0;l 现在学习的是第32页,共56页C+2-33 例:定义函数执行输入输出
37、例:定义函数执行输入输出l#include lusing namespace std;lclass Timel public:l int hour;l int minute;l int sec;l;l int main()void set_time(Time&);void show_time(Time&);Time t1;set_time(t1);show_time(t1);Time t2;set_time(t2);show_time(t2);return 0;l 现在学习的是第33页,共56页C+2-34 例例l#include lusing namespace std;lclass Tim
38、el public:l int hour;l int minute;l int sec;l;lint main()l l void set_time(Time&);l void show_time(Time&);l Time t1;l set_time(t1);l show_time(t1);l Time t2;l set_time(t2);l show_time(t2);l return 0;l l l void set_time(Time&t)cint.hour;cint.minute;cint.sec;void show_time(Time&t)coutt.hour:t.minute:t
39、.secendl;现在学习的是第34页,共56页C+2-35 例:定义含默认值参数的例:定义含默认值参数的set_time和和show_time函数函数l#include lclass Timel public:l int hour;l int minute;l int sec;l;lint main()l lTime t1;l set_time(t1,12,23,34);l show_time(t1);l Time t2;l set_time(t2);l show_time(t2);ll 现在学习的是第35页,共56页C+2-36 例例l#include lusing namespace s
40、td;lclass Timel public:l int hour;l int minute;l int sec;l;lint main()l l void set_time(Time&,int hour=0,int minute=0,int sec=0);l void show_time(Time&);l Time t1;l set_time(t1,12,23,34);l show_time(t1);l Time t2;l set_time(t2);l show_time(t2);l return 0;l l void set_time(Time&t,int hour=9,int minut
41、e=30,int sec=0)t.hour=hour;t.minute=minute;t.sec=sec;void show_time(Time&t)coutt.hour:t.minute:t.secendl;现在学习的是第36页,共56页C+2-37 例:定义成员函数输入时分秒并输出例:定义成员函数输入时分秒并输出l#include lclass Timel public:lprivate:l int hour;l int minute;l int sec;l;lint main()l l Time t1;l t1.set_time();l t1.show_time();l Time t2;
42、l t2.set_time();l t2.show_time();ll void Time:set_time()cinhour;cinminute;cinsec;void Time:show_time()couthour:minute:secendl;现在学习的是第37页,共56页C+2-38 例例l#include lusing namespace std;lclass Timel public:l void set_time();l void show_time();l private:l int hour;l int minute;l int sec;l;lint main()l l T
43、ime t1;l t1.set_time();l t1.show_time();l Time t2;l t2.set_time();l t2.show_time();l return 0;l l void Time:set_time()cinhour;cinminute;cinsec;void Time:show_time()couthour:minute:secendl;现在学习的是第38页,共56页C+2-39 习题习题1现在学习的是第39页,共56页C+2-40 习题习题1l#include lusing namespace std;lclass Timel public:l int h
44、our;l int minute;l int sec;l ;lTime t;lvoid set_time(void)l cint.hour;l cint.minute;l cint.sec;l void show_time(void)coutt.hour:t.minute:t.secendl;int main()set_time();show_time();return 0;现在学习的是第40页,共56页C+2-41 例例2.4 P61l#include lusing namespace std;lclass Array_maxlpublic:l void set_value();l void
45、 max_value();l void show_value();l private:l int array10;l int max;l;int main()Array_max arrmax;arrmax.set_value();arrmax.max_value();arrmax.show_value();return 0;现在学习的是第41页,共56页C+2-42 2.6 类的封装和信息隐蔽类的封装和信息隐蔽l公用接口和私有实现的分离公用接口和私有实现的分离我们已经学到,我们已经学到,C+通过类的封装,将类的数据成员和成员函数集成到一个类中。而一般在通过类的封装,将类的数据成员和成员函数集成
46、到一个类中。而一般在类的声明时,往往把数据成员指定成私有的,使它们与外界隔离,即,类的声明时,往往把数据成员指定成私有的,使它们与外界隔离,即,不能在类外直接使用私有成员,外界只能通过类的公有函数,间接进行不能在类外直接使用私有成员,外界只能通过类的公有函数,间接进行对私有成员的操作。换句话说,外界与类的私有成员的唯一联系渠道,对私有成员的操作。换句话说,外界与类的私有成员的唯一联系渠道,就是该类的公有成员函数。就是该类的公有成员函数。所以,我们一般把成员函数指定成公有的所以,我们一般把成员函数指定成公有的(public)性质(除非某些成员函数不想让外界调用)。性质(除非某些成员函数不想让外界
47、调用)。这就是所谓的这就是所谓的“外部接口外部接口”与内部实现的分离,以起到信息隐蔽与内部实现的分离,以起到信息隐蔽的作用。而这是软件工程最基本的原则。的作用。而这是软件工程最基本的原则。现在学习的是第42页,共56页C+2-43 定义一个类就是实现定义一个类就是实现对创建一个对象的数对创建一个对象的数据结构的描述。据结构的描述。在类中,一些成员是在类中,一些成员是保护的,被有效地屏保护的,被有效地屏蔽,以防外界的干扰蔽,以防外界的干扰和误操作。和误操作。另一些成员是公共的另一些成员是公共的,作为接口提供外界,作为接口提供外界使用。使用。右图是对它们采用的右图是对它们采用的图示方法说明类的组图
48、示方法说明类的组成结构。以成结构。以Point 类为例。类为例。xoffsetyoffsetsetangleradiusxy封封装装体体内内部部数数据据成成员员Point 类类访访问问接接口口现在学习的是第43页,共56页C+2-44 2.6 类的封装和信息隐蔽类的封装和信息隐蔽l类声明和成员函数定义的分离类声明和成员函数定义的分离当一个类被多个程序使用时,一般将类的声明(包括成员函数的声明当一个类被多个程序使用时,一般将类的声明(包括成员函数的声明)放在指定的头文件中,用户在编程时,将该头文件包含近来就可以)放在指定的头文件中,用户在编程时,将该头文件包含近来就可以了。而不必在每个使用该类的
49、程序中重复书写该类的声明。了。而不必在每个使用该类的程序中重复书写该类的声明。我们然后可以直接在程序中直接定义该类的对象,直接调用该类的公我们然后可以直接在程序中直接定义该类的对象,直接调用该类的公有成员函数。为了实现信息隐蔽,对类的成员函数的定义一般不放在有成员函数。为了实现信息隐蔽,对类的成员函数的定义一般不放在头文件中,而放在另一个文件中。头文件中,而放在另一个文件中。然后按照对多文件程序的编译和运行方法对程序进行编译和连接。请然后按照对多文件程序的编译和运行方法对程序进行编译和连接。请看下面示例。看下面示例。现在学习的是第44页,共56页C+2-45 2.6 类的封装和信息隐蔽类的封装
50、和信息隐蔽/rectangle.hclass rectangle private:int length,width;public:void Put();void display();/rectangle.cpp#include#include“rectangle.h”void rectangle:Put()length=5;width=4;void rectangle:display()cout“area=“length*width endl;/main.cpp#include#include“rectangle.h”void main()rectangle r1;r1.display();现