【教学课件】第六章类和对象.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《【教学课件】第六章类和对象.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第六章类和对象.ppt(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章 类和对象类和对象6 6.1 面向对象程序设计概述面向对象程序设计概述 6 6.2 结构结构 6.3 类和对象类和对象 6.4 继承和派生继承和派生 6.5多态性多态性 6.6 程序举例程序举例6.1 6.1 面向对象程序设计(面向对象程序设计(OOPOOP)概述)概述基本概念基本概念 Object Oriented Programming 对象:现实世界的实体,每个对象都有所属的类对象:现实世界的实体,每个对象都有所属的类 类:类:对一组对象共同具有的属性和行为的抽象,对一组对象共同具有的属性和行为的抽象,具有封装和隐藏性、还具有继承性。具有封装和隐藏性、还具有继承性。消息:向某
2、对象请求服务的一种表达方式,是对消息:向某对象请求服务的一种表达方式,是对 象与外界、对象与其它对象之间联系的工具象与外界、对象与其它对象之间联系的工具 方法:对某对象接受消息后所采取的操作的描述。方法:对某对象接受消息后所采取的操作的描述。特点特点封装性封装性继承性继承性多态性多态性C+C+中,通过类和对象实现对数据的封装,使得程序的修改维护中,通过类和对象实现对数据的封装,使得程序的修改维护更方便。是更方便。是OOPOOP的基础的基础。连接类与类的层次模型,利用现有类派生出新类的过程称为类连接类与类的层次模型,利用现有类派生出新类的过程称为类继承继承,支持代码重用、提供了无限重复利用程序资
3、源的途径、支持代码重用、提供了无限重复利用程序资源的途径、节省程序开发的时间和资源,是节省程序开发的时间和资源,是OOPOOP的关键。的关键。发出同样的消息被不同类型的对象接收时导致完全不同的行发出同样的消息被不同类型的对象接收时导致完全不同的行为为,是是OOPOOP的重要补充的重要补充说明结说明结构类型构类型的关键字的关键字 6.2 6.2 结构结构C+C+中的类从中的类从C C语言中的结构概念演变而来语言中的结构概念演变而来 结构类型说明形式结构类型说明形式struct 结构类型标识符结构类型标识符 结构成员结构成员1;1;结构成员结构成员2;2;结构成员结构成员n;n;类型可任意类型可任
4、意(不能为该结构自身)(不能为该结构自身)struct date int month;int day;int year;struct man char name15;char sex;int age;date birthday;如,说明一个结构类型如,说明一个结构类型datedate,含三个整型数据成员,含三个整型数据成员在此基础上,又在此基础上,又可说明另一个结可说明另一个结构类型构类型manmanbirthdayNamesexagemonthdayyearstructman结构类型结构变量定义结构变量定义先说明结构类型再定义结构变量先说明结构类型再定义结构变量在说明结构数据类型的同时定义结
5、构变量在说明结构数据类型的同时定义结构变量省略结构标识符直接定义结构类型变量省略结构标识符直接定义结构类型变量struct man man1,man2;struct man char name15;char sex;int age;struct date birthday;man1,man2;struct char name15;char sex;int age;struct date birthday;man1,man2;无类型名变量无类型名变量结构变量的引用结构变量的引用形式:形式:结构变量名结构变量名.成员名成员名(*(*指向结构的指针指向结构的指针).).成员名成员名 指向结构的指针指
6、向结构的指针-成员名成员名或或或或通过指向结构的指针引用结构变量成员通过指向结构的指针引用结构变量成员成员访问运算符成员访问运算符优先级最高的优先级最高的四个运算符之一四个运算符之一 括号不能少括号不能少如,假设有定义如,假设有定义manm,*p=&m;strcpy(m.name,Fang Min);p-birthday.month=8;则可如下引用结构成员则可如下引用结构成员6.3 6.3 类和对象类和对象#include iostream.hclass Circleprivate:double x,y,r;public:void print()cout圆心圆心:(x,y)endl;cout
7、半径半径:rendl;void set(double x1,double y1,double r1)x=x1;y=y1;r=r1;void main()Circle p;p.set(0,0,2);p.print();引例引例类定义类定义数据成员数据成员成员函数成员函数定义类对象定义类对象对对象调用对对象调用成员函数成员函数CircleCircle类将圆的属性类将圆的属性(圆心坐标和半径)(圆心坐标和半径)和操作(和操作(printprint、setset)封装在一起)封装在一起 上述定义的上述定义的CircleCircle类实际上也相当于一种新的数据类实际上也相当于一种新的数据类型,包含了数据
8、和对数据的操作,其成员描述如下:类型,包含了数据和对数据的操作,其成员描述如下:数据成员数据成员成员函数成员函数名称名称含义含义名称名称功能功能x圆心坐标圆心坐标x值值set设置数据成员值设置数据成员值y圆心坐标圆心坐标 y值值print输出数据成员值输出数据成员值r圆半径圆半径6.3.1 6.3.1 类的定义类的定义类是一种复杂的数据类型,它是将不同类型的类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的运算封装在一起的集合体,数据和与这些数据相关的运算封装在一起的集合体,类的结构是用来确定一类对象的行为,而这些行为是类的结构是用来确定一类对象的行为,而这些行为是通过类的内部数据
9、结构和相关的操作来确定的。通过类的内部数据结构和相关的操作来确定的。定义格式:定义格式:class 类名类名public:;private:;protected:;;类的说明类的说明类的说明类的说明类的说明类的说明类的说明类的说明实现部分实现部分定义类的关键定义类的关键字字说明说明部分部分实现部分实现部分访访问问权权限限修修饰饰符符说明:说明:定义包括说明部分和实现部分。若成员函数在说明部分定义包括说明部分和实现部分。若成员函数在说明部分已定义,则实现部分可省略。已定义,则实现部分可省略。访问权限修饰符:访问权限修饰符:public(公有)、公有)、private(私有私有)和)和 prote
10、cted(保护)保护)缺省时为缺省时为private。公有成员通常为成员函数,可在程序中引用,私有成员公有成员通常为成员函数,可在程序中引用,私有成员通常是数据成员,只有成员函数或友元函数才可引用。通常是数据成员,只有成员函数或友元函数才可引用。类体中不允许对数据成员初始化。类体中不允许对数据成员初始化。自身类的对象不可以作为自己的成员自身类的对象不可以作为自己的成员class Bprivate:int year=2002,month=10,day=12;B b;错错数据成员数据成员成员函数成员函数名称名称含义含义名称名称功能功能name职员姓名职员姓名set设置数据成员值设置数据成员值sex
11、职员性别职员性别display 输出数据成员值输出数据成员值wage 职员工资职员工资 如,定义一个职工类,该类是对所有职工某些信如,定义一个职工类,该类是对所有职工某些信息的抽象,包括如下成员:息的抽象,包括如下成员:class Staffprivate:char name30;char sex;float wage;public:void display();void set(char*n,char s,float w);;void Staff:display()coutname:sex,wageendl;void Staff:set(char*n,char s,float w)strcp
12、y(name,n);sex=s;wage=w;说明部分说明部分实现部分实现部分作用域运算作用域运算符(类体外符(类体外实现时需要)实现时需要)6.3.2 6.3.2 对象的定义对象的定义类名仅提供一种类型定义,只有在定义属于类的变类名仅提供一种类型定义,只有在定义属于类的变量后,系统才会为其预留空间,这种变量称为对象,它量后,系统才会为其预留空间,这种变量称为对象,它是类的实例。是类的实例。格式格式:如,假设如,假设A A是一个已定义过的类,则可定义:是一个已定义过的类,则可定义:指向指向A类对象的指针类对象的指针A类的对象类的对象对象数组对象数组类名类名 对象名表;对象名表;A a1,*p,
13、a5成员引用成员引用一般对象成员一般对象成员数据成员:数据成员:成员函数:成员函数:()指向对象的指针的成员表示法:指向对象的指针的成员表示法:数据成员:数据成员:成员函数:成员函数:对象名对象名 成员名成员名对象名成员名(参数表)对象名成员名(参数表)对象指针名对象指针名-成员名成员名(*(*对象指针名对象指针名).).成员名成员名或或 对象指针名对象指针名-成员名成员名(参数表参数表)(*对象指针名对象指针名.成员名(参数表)成员名(参数表)引用方式同结构成员引用方式同结构成员#include iostream.h#include string.hclass Staffprivate:ch
14、ar name30;char sex;float wage;public:void display()coutname:sex,wageset(GaoLing,f,2003);s1-display();S1为指向为指向s的指针的指针可修改为如下形式吗可修改为如下形式吗?s.name=“WangQiang”s.sex=m;s.wage=1526例例6-16.3.3 6.3.3 对象的初始化对象的初始化1.1.构造函数和析构函数构造函数和析构函数 例例6-2 6-2 看引例的另一种实现看引例的另一种实现#include iostream.hclass Circleprivate:double x,
15、y,r;public:void print()cout圆心圆心:(x,y)endl;cout半径半径:rendl;Circle(double x1,double y1,double r1)x=x1;y=y1;r=r1;void main()Circle p(0,0,2);p.print();构造函数、构造函数、同类名同类名1.定义的同时初定义的同时初始化对象始化对象2.省略对赋初值省略对赋初值成员函数的额外成员函数的额外调用调用构造函数特点构造函数特点析构函数特点:析构函数特点:若一个对象被定义在函数体内,则当该函数结束时,若一个对象被定义在函数体内,则当该函数结束时,该对象的析构函数被自动调
16、用。该对象的析构函数被自动调用。当一个对象是使用当一个对象是使用newnew运算符被动态创建的,在使用运算符被动态创建的,在使用deletedelete释放时,析构函数将会被自动调用释放时,析构函数将会被自动调用是成员函数,可写在类体内,亦可写在类体外。是成员函数,可写在类体内,亦可写在类体外。函数名同类名,不能指定函数类型,可以带参数。函数名同类名,不能指定函数类型,可以带参数。可重载,即可定义多个参数个数不同的函数。可重载,即可定义多个参数个数不同的函数。在创建对象时由系统自动调用,程序中不能直接调用在创建对象时由系统自动调用,程序中不能直接调用。是成员函数,可写在类体内,亦可写在类体外。
17、是成员函数,可写在类体内,亦可写在类体外。函数名同类名,前面多个字符函数名同类名,前面多个字符“”,不指定类型,无参。,不指定类型,无参。不可重载,即一个类只能定义一个析构函数。不可重载,即一个类只能定义一个析构函数。可被调用,也可由系统调用。系统自动调用情况如下:可被调用,也可由系统调用。系统自动调用情况如下:2.2.缺省构造函数和缺省析构函数缺省构造函数和缺省析构函数形式:形式:说明:说明:若若没有定义任何构造函数没有定义任何构造函数,系统会自动生成上述无参的缺省,系统会自动生成上述无参的缺省构造函数及析构函数构造函数及析构函数若定义一个若定义一个静态静态对象而没有指明初始化时,编译器会按
18、缺省对象而没有指明初始化时,编译器会按缺省构造函数对对象的所有数据成员都初始化为或空。构造函数对对象的所有数据成员都初始化为或空。:():()例例6.3 6.3 定义一个定义一个Circle1Circle1类,具有求一个圆的面积、类,具有求一个圆的面积、求两个圆的面积之和,以及输出面积等功能求两个圆的面积之和,以及输出面积等功能 。#include iostream.hclass Circle1private:double x,y,r,s;public:void print()cout圆心圆心:(x,y)endl;cout半径半径:rendl;Circle1()Circle1(double x
19、1,double y1,double r1)x=x1;y=y1;r=r1;void addarea(Circle1 p1,Circle1 p2)s=3.14*(p1.r*p1.r)+3.14*(p2.r*p2.r);void disp()cout面积面积:sendl;void main()Circle1 p1(0,0,2),p2(1,1,4),p3;p1.print();p2.print();p3.addarea(p1,p2);p3.disp();可缺省吗?验证一下可缺省吗?验证一下初始化了吗初始化了吗#include#include class countint num;public:cou
20、nt();count();void process();count:count()num=0;count:count()cout字符个数:字符个数:numendl;void count:process()while(cin.get()!=n)num+;coutendl;void main()count c;cout输入一个句子:输入一个句子:;c.process();例例6.4 6.4 析构函数示例析构函数示例析构函数中输出处理结析构函数中输出处理结果果(未设专门输出函数)未设专门输出函数)析构函数在程序结束析构函数在程序结束前由系统自动调用前由系统自动调用3.3.拷贝初始化构造函数拷贝初始化
21、构造函数 例例6.56.5#include iostream.hclass Circle1private:double x,y,r,s;public:void print()cout圆心圆心:(x,y)endl;cout半径半径:rendl;Circle1(double x1,double y1,double r1)x=x1;y=y1;r=r1;Circle1(Circle1&p)x=p.x;y=p.y,r=p.r;void main()Circle1 p1(0,0,2),p2(p1);p1.print();p2.print();用于用已知对象初始化被创建的同类对象用于用已知对象初始化被创建的
22、同类对象只有一个参数,且是对某个对象的引用只有一个参数,且是对某个对象的引用常用于做函数的形参及返回值常用于做函数的形参及返回值拷贝初始化构造函拷贝初始化构造函数数(引用做参数引用做参数)已知对象做已知对象做初值初值常对象和常成员常对象和常成员 1.1.常成员函数常成员函数形式:形式:类型说明符类型说明符 函数名函数名(参数表参数表)const)const不修改对象数据成员的成员函数才能声明为不修改对象数据成员的成员函数才能声明为constconst函数函数构造函数和析构函数不能声明为构造函数和析构函数不能声明为constconst只有常成员函数可以操作常对象只有常成员函数可以操作常对象说明:
23、说明:例例6.66.6常成员函数示例常成员函数示例#include iostream.hclass Timeprivate:int hour,minute,second;public:Time:Time()Time:Time(int h,int m,int s)hour=h;minute=m;second=s;void settime(int h,int m,int s)hour=h;minute=m;second=s;void print()const couthour:minute:secondendl;void main()Time t1;const Time t2(10,23,34);
24、/定义定义t2为常对象为常对象 t1.settime(11,15,20);t1.print();/t2.settime(4,12,15);t2.print();前面的解释符可去掉吗前面的解释符可去掉吗不修改数据成员,不修改数据成员,定义为常函数定义为常函数settime函数可函数可声明为声明为const吗吗2.2.常数据成员常数据成员 对不应该被修改的数据成员声明为对不应该被修改的数据成员声明为constconst,可使其受,可使其受到强制保护,初始化方式与一般数据成员不同。到强制保护,初始化方式与一般数据成员不同。class Decrement private:int num;const i
25、nt dec;/将将dec声明为常数据成员声明为常数据成员 public:Decrement(int n,int d):dec(d)num=n;void fdec()num=num-dec;void print()const coutnum=num,dec=decendl;初始化列表的初始化列表的方式初始化方式初始化静态成员静态成员静态成员的提出是为了解决静态成员的提出是为了解决数据共享数据共享的问题,它比全局变的问题,它比全局变量在实现数据共享时更为安全,是实现同类多个对象数据共享量在实现数据共享时更为安全,是实现同类多个对象数据共享的好方法。在类中,分为静态数据成员和静态函数。的好方法。在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 第六 对象
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内