733类与对象.ppt

上传人:sccc 文档编号:5632922 上传时间:2023-08-04 格式:PPT 页数:46 大小:272.51KB
返回 下载 相关 举报
733类与对象.ppt_第1页
第1页 / 共46页
733类与对象.ppt_第2页
第2页 / 共46页
733类与对象.ppt_第3页
第3页 / 共46页
733类与对象.ppt_第4页
第4页 / 共46页
733类与对象.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《733类与对象.ppt》由会员分享,可在线阅读,更多相关《733类与对象.ppt(46页珍藏版)》请在三一办公上搜索。

1、1,+,第四章 类与对象,C,2,主要内容,面向对象的基本特点 类和对象 构造函数和析构函数 类的组合 结构体与联合体,3,面向对象,目的:实现软件设计的产业化 观点:自然界是由实体(对象)所组成 程序设计方法:使用面向对象的观点来描述模仿并处理现实问题。要求:高度概括、分类、和抽象。,面向对象的方法,面向对象的主要特点,抽象、封装、继承、多态,4,抽象,抽象:对具体问题(对象)进行概括,抽出这一类对象的公共性质并加以描述的过程。,首先注意的是问题的本质及描述,其次是实现过程或细节 抽象包括:数据抽象和行为抽象 数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)行为抽象(功能抽象、代码

2、抽象):描述某类对象的共同行为或功能特征 抽象的实现:通过类的声明。,5,抽象示例,例:时钟的描述,数据抽象:int hour,int minute,int second,行为抽象:showTime(),setTime(),6,封装,封装:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,即将数据与操作数据的函数进行有机结合,形成“类”,其中数据和函数都是类的成员。,封装可以增强数据的安全性,并简化编程。用户不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。,7,class Clock public:void setTime(int NewH,int N

3、ewM,int NewS);void showTime();private:int hour,minute,second;,抽象实现,例:时钟的描述,数据抽象:int hour,int minute,int second,行为抽象:showTime(),setTime(),时钟类,public和private用于指定成员的不同访问权限。,此处的分号不能省略!,8,继承与多态,继承:C+提供了继承机制,允许程序员在保持原有类特性的基础上,进行更具体、更详细的说明。(详见第 7 章),多态:同一段程序能处理多种类型对象的能力。在C+中,多态性是通过强制多态(如类型转换)、重载多态(如函数重载、运算

4、符重载)、类型参数化和包含多态(如虚函数、模板)。(详见第 8 章),9,主要内容,面向对象的基本特点 类和对象 构造函数和析构函数 类的组合 结构体与联合体,10,类和对象,类是 C+面向对象程序设计的核心!,类与函数,函数是结构化程序设计的基本模块,函数将逻辑上相关的数据与语句封装,用于完成特定的功能。类是面向对象程序设计的基本模块,类将逻辑上相关的数据与函数封装,是对问题的抽象描述。,类的集成程度更高,更适合大型复杂程序的开发。,类的使用:先定义后使用,11,类的定义,类的定义,class 类的名称 public:公有成员(外部接口)private:私有成员 protected:保护型成

5、员;,12,类的定义,注:在类中可以只声明函数原型,函数的实现(函数体)可以在类外面定义,class Clock public:void setTime(int NewH,int NewM,int NewS);void showTime();private:int hour,minute,second;,Clock myclock;Clock y;,13,访问权限,类的成员:数据成员(描述问题的属性)和函数成员(描述问题的行为),类的成员的访问权限控制:public,private,protected,public(公有类型、外部接口):任何外部函数都可以访问公有类型的数据和函数,privat

6、e(私有类型):只能被本类中的函数成员访问,任何来自外部的访问都非法,protected(保护类型):与私有类似,区别在于继承过程中的影响不同(见第 7 章),14,class Clock private:int hour,minute,second;public:void setTime(int NewH,int NewM,int NewS);void showTime();,访问权限,几点说明:,一般情况下,类的数据成员都应该声明为私有类型 一个类如果没有任何外部接口,则无法使用 在定义类时,不同访问属性的成员可以按任意顺序出现,修饰访问权限的关键字也可以多次出现,但一个成员只能有一种访问

7、属性!,一般将公有类型的成员放在最前面,便于阅读。,例:,上述声明并没有为 Clock 分配内存,只是告诉编译器 Clock 是什么:包含哪些数据,有什么功能。,15,对象,对象是类的实例,即具有该类型的变量,对象的定义,类的名称 对象名,例:,对象所占的内存空间只用于存放数据成员,函数成员在内存中只占一份空间,即不会在每个对象中存储副本 定义对象的过程也称为类的实例化,Clock myclock;Clock y;,声明一个类后,便可将其作为新数据类型来声明变量(即对象),16,对象成员的访问,访问对象的成员的一般形式,对象名.数据成员名,对象名.函数成员名(参数列表),例:,注:类的成员函数

8、可以访问所有数据成员;外部函数只能访问公有成员。,myclock.showTime();myclock.setTime(16,10,28);,17,成员函数,类的成员函数的定义,与普通函数的区别:前面要加上类的名称和两个连续冒号 类的成员函数可以在类外部定义,但在类内部必须声明,例:,数据类型 类的名称:函数名(形参列表)函数体;,void Clock:setTime(int newH,int newM,int newS)hour=newH;minute=newM;second=newS;,18,目的对象,调用成员函数时,需用“.”操作符指定调用所针对的对象,这一对象就是本次调用的目的对象。,

9、在成员函数中,可以直接引用目的对象的所有数据成员,而无需使用“.”操作符。,在成员函数中,引用其它对象的数据成员和函数成员时,必须使用“.”操作符。,在类的成员函数中,既可以访问目的对象的私有成员,也可以访问当前类的其它对象的私有成员。,19,默认形参值,与普通函数一样,成员函数也可以带默认形参值。,注:成员函数的默认形参值只能在类的定义中设置,不能在类定义之外的函数定义中设置。,带默认形参值的成员函数,class Clock public:void setTime(int NewH=0,int NewM=0,int NewS=0);.;,20,内联成员函数,内联成员函数的定义:隐式方式和显式

10、方式,隐式方式:将函数体直接放在类的定义中,class Clock public:void setTime(int NewH=0,int NewM=0,int NewS=0);void showTime()couthour“:”minute“:”secondendl;.;,21,内联成员函数,使用内联函数可以减少调用开销,提高效率,但只适合相当简单的函数;使用显式方式定义内联函数可以保持类定义的简洁,内联成员函数的定义:隐式方式和显式方式,显式方式:将函数体直接放在类的定义中,class Clock public:void setTime(int NewH=0,int NewM=0,int N

11、ewS=0);void showTime();.;inline void Clock:showTime()couthour“:”minute“:”secondendl;,22,程序示例,#include using namespace std;class Clock/时钟类的声明 public:/外部接口,公有成员函数 void setTime(int NewH=0,int NewM=0,int NewS=0);void showTime();private:/私有数据成员 int hour,minute,second;/成员函数的定义(时钟类成员函数的具体实现)void Clock:setT

12、ime(int NewH,int NewM,int NewS)hour=NewH;minute=NewM;second=NewS;inline void Clock:showTime()couthour:minute:secondendl;,23,/主函数int main()Clock myClock;/定义对象myClock coutFirst time:endl;myClock.setTime();/设置时间为默认值 myClock.showTime();/显示时间 coutSecond time:endl;myClock.setTime(16,10,28);/设置时间为 16:10:28

13、 myClock.showTime();/显示时间 system(pause);return 0;,程序示例,ex_class_01.cpp,24,主要内容,面向对象的基本特点 类和对象 构造函数和析构函数 类的组合 结构体与联合体,25,构造与析构函数,构造函数:负责对象初始化,类与对象的关系类似于基本数据类型与普通变量之间的关系,不同对象之间的主要区别:名称与数据,对象的初始化:定义对象时,设置数据成员的值,析构函数:在特定对象使用结束后,经常需要进行一些清理工作,这部分工作就有析构函数负责,构造函数与析构函数是对象的两个特殊的成员函数,26,构造函数,构造函数,构造函数的函数名与类的名称

14、相同;构造函数没有返回值;构造函数在对象创建时会被系统自动调用。若没有构造函数,编译器会自动产生出构造函数(形参和函数体都为空,如:Clock())可以是内联函数、带默认形参值或函数重载,对象创建的过程 申请内存空间(只存放数据成员)初始化:调用构造函数,27,class Clock public:Clock(int x,int y,int z);/构造函数 void setTime(int NewH=0,int NewM=0,int NewS=0);void showTime();private:int hour,minute,second;/构造函数的定义Clock:Clock(int x

15、,int y,int z)hour=x;minute=y;second=z;.,构造函数示例,构造函数前不能加数据类型或void!,28,int main Clock c1(0,0,0);/声明对象并初始化 c1.showTime();c1.setTime(16,10,28);Clock c2;/ERROR return 0;,构造函数示例,ex_class_02.cpp,29,class Clock public:void Clock(int x,int y,int z);/构造函数 void Clock()hour=0;minute=0;second=0;/函数重载 void setTim

16、e(int NewH=0,int NewM=0,int NewS=0);void showTime();private:int hour,minute,second;.,构造函数示例,ex_class_03.cpp,思考:如何显示时间 16:30:00,30,复制构造函数,复制构造函数:一类特殊的构造函数,用已有的对象去初始化新的对象。,若没有定义复制构造函数,系统会在必要时自动生成一个,功能就是将已有对象的数据成员全部复制到新建立的对象中。,class 类名 public:类名(形参列表);/构造函数 类名(类名,31,示例,class Point/Point 类的声明 public:/外部

17、接口Point(int x0=0,int y0=0)x=x0;y=y0;/构造函数Point(Point.,32,复制构造函数,普通构造函数在对象建立时被自动调用,而复制构造函数在以下三种情况下会被调用:,(1)用一个对象去初始化另一个同类的对象时,int main Point a(1,2);Point b(a);/用 a 初始化 b,构造函数被调用 Point c=a;/用 a 初始化 c,构造函数被调用 cout b.getx()endl;return 0;,以上两种方式只是写法上不同,执行的操作完全相同,33,复制构造函数,(2)若函数的形参是类的对象,调用函数时形参与实参的结合,vio

18、d f(Point p)cout p.getx()endl;,只有在进行值传递时,复制构造函数才会被调用;若传递的是引用,则不会调用复制构造函数。因此传递比较大的对象时,传递引用效率要高。,(3)若函数返回值是类的对象,函数执行完后返回主调函数时,Point g()Point A(1,2);return A;int main Point b;b=g();/?return 0;,ex_class_04.cpp,34,析构函数,析构函数:负责对象被删除时的一些清理工作。,析构函数的函数名由类名前加“”组成 析构函数没有返回值 析构函数在对象生存期即将结束时被自动调用 析构函数不接收任何参数 若没有

19、析构函数,系统会自动生成一个析构函数(函数体都为空,如:Point()),35,应用实例,例:一圆形游泳池如图所示,现在需在其周围建一圆形过道,并在其四周围上栅栏。栅栏价格为35元/米,过道造价为20元/平方米。过道宽度为3米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。,游泳池,过道,分析:可以定义一个类:圆。数据成员:圆的半径;函数成员:计算周长与面积;,36,应用实例,class Circle/声明类 Circle public:/外部接口 Circle(float x)r=x;/构造函数 float Circum();/计算圆周长 float Area();/计算圆面积

20、private:/私有数据成员 float r;/成员函数 float Circle:Circum()/计算圆的周长 return 2*pi*r;float Circle:Area()/计算圆的面积 return pi*r*r;,37,应用实例,int main()float x,y,z;cout x;Circle Pool(x);/声明 Circle 对象 Circle PoolRim(x+3);/计算栅栏造价并输出 y=PoolRim.Circum()*price1;cout 栅栏造价为:y endl;/计算过道造价并输出 z=(PoolRim.Area()-Pool.Area()*pri

21、ce2;cout 过道的造价为:z endl;return 0;,ex_class_05.cpp,38,主要内容,面向对象的基本特点 类和对象 构造函数和析构函数 类的组合 结构体与联合体,39,类的组合,类的组合:将已有的类的对象作为新的类的成员。,class Point/声明Point类 public:.private:int x,y;class Line/声明Line类 public:.private:Point p1,p2;,例:,40,初始化,在创建类的对象时,如果这个类包含其它类的对象(内嵌对象成员),则各个内嵌对象将首先被自动创建 初始化时需要对每个内嵌对象成员进行初始化,组合类

22、构造函数的一般形式,类名:类名(形参):内嵌对象1(形参),内嵌对象2(形参),.类的初始化,“内嵌对象1(形参),内嵌对象2(形参),.”为初始化列表,其作用是对内嵌对象进行初始化 除了自身的构造函数外,内嵌对象的构造函数也被调用 构造函数调用顺序:按内嵌对象在组合类的定义中出现的顺序依次调用内嵌对象的构造函数 最后调用本类的构造函数 析构函数的调用顺序与构造函数相反,41,前向引用声明,类必须先定义后使用 若两个类互相引用,则需要使用前向引用声明,class B;/前向引用声明class A/声明 A 类 public:void f(B b);class A/声明 B 类 public:v

23、oid g(A a);,例:,使用前向引用声明时,只能使用被声明的符号,而不能涉及类的任何细节,42,UML,详见相关资料(略),UML:Unified Modeling Language面向对象建模语言,通过图形的方式描述面向对象程序设计。,43,主要内容,面向对象的基本特点 类和对象 构造函数和析构函数 类的组合 结构体与联合体,44,结构体,结构体:(struct)一种特殊形态的类,为了保持与 C 语言程序的兼容性。,结构体的定义,struct 结构体名称 public:公有成员 private:私有成员 protected:保护型成员;,45,结构体,结构体与类的唯一区别:在类中,对于未指定访问控制属性的成员,默认为私有成员;而在结构体中,未指定访问控制属性的成员,默认为公有成员。,C+中的结构体可以含数据成员和函数成员,而 C 语言中的结构体只能含数据成员。,46,联合体,联合体的所有成员共享一个存储单元,联合体:(union)一种特殊形态的类,从 C 语言继承而来。,union Mark char grade;/等级制 bool pass;/是否通过 int score;/百分制;,例:,联合体的所有成员中同时至多一个有意义 联合体中成员的默认访问控制属性是公有类型 联合体一般只存数据,不含函数成员,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号