《C类和对象》课件.ppt

上传人(卖家):晟晟文业 文档编号:5103168 上传时间:2023-02-11 格式:PPT 页数:77 大小:307.02KB
下载 相关 举报
《C类和对象》课件.ppt_第1页
第1页 / 共77页
《C类和对象》课件.ppt_第2页
第2页 / 共77页
《C类和对象》课件.ppt_第3页
第3页 / 共77页
《C类和对象》课件.ppt_第4页
第4页 / 共77页
《C类和对象》课件.ppt_第5页
第5页 / 共77页
点击查看更多>>
资源描述

1、nC+C+语言是语言是C C的扩充的扩充n扩充扩充 C C 语言语言 C+C+语言语言n扩充的目的:扩充的目的:n支持面向对象程序设计支持面向对象程序设计n扩充的功能:扩充的功能:n类定义类定义n消息传递(类似函数调用)消息传递(类似函数调用)n继承、虚函数继承、虚函数第二章 类和对象对象与封装对象与封装n对象对象 相对独立的实体相对独立的实体n具有表示其状态、特征的属性具有表示其状态、特征的属性n具有表示其行为、功能的操作具有表示其行为、功能的操作n封装性:只有自身操作可访问对象属性封装性:只有自身操作可访问对象属性n面向对象方法面向对象方法n将分析、设计的系统和程序都抽象为对象组成的模型将

2、分析、设计的系统和程序都抽象为对象组成的模型n面向对象程序设计面向对象程序设计n运行中程序实例运行中程序实例=若干对象实例若干对象实例+交互控制交互控制n程序程序=若干对象类(用于描述各种对象)若干对象类(用于描述各种对象)n对象类对象类=程序模块程序模块nC+C+程序程序=主函数主函数(main)+main)+若干类定义若干类定义类nC+的类是把各种不同类型的数据(称为数据成员)和对数据的操作(成员函数)组织在一起而形成的用户自定义的数据类型。nC+中,类定义包括类说明和类实现两大部分。说明部分提供了对该类所有数据成员和成员函数的描述,而实现部分提供了所有成员函数的实现代码。类的定义 *.h

3、 class 类名 数据成员的说明数据成员的说明public:方法成员的说明方法成员的说明;n说明:说明:n类名由用户自己定,一般首字母大写n默认是private,只有类中的成员函数才能访问n注意:类定义的末尾有一分号n注意:不能在类定义中对数据成员进行初始化 class Location int x=25,y;/ERROR ;class Date int year,month,day;public:Date(int y,int m,int d);void setYear(int y);void setMonth(int m);void setDay(int d);int getYear();

4、int getMonth();int getDay();/date.h类的定义成员函数的定义1、将成员函数的定义直接写在类中n适合于成员函数规模较小的情况(内联函数)2、在类的定义体中只写出成员函数的原型说明,而成员函数的定义之后再写n通常将类的定义写在一个头文件(.h文件)中,成员函数的定义写在一个程序文件(.cpp文件)中n一般形式:返回类型 类名:成员函数名(参数说明)类体 class Date int year,month,day;public:Date(int y,int m,int d);void setYear(int y);void setMonth(int m);void s

5、etDay(int d);int getYear();int getMonth();int getDay()return day;/内联函数;/date.cpp 实现部分实现部分#include date.h Date:Date(int y,int m,int d)year=y;month=m;day=d;int Date:getYear()return year;int Date:getMonth()return month;int Date:getDay()return day;void Date:setYear(int y)year=y;void Date:setMonth(int m)

6、month=m;void Date:setDay(int d)day=d;#include#include date.hvoid main()Date k(2000,12,1);coutk.getMonth()year;c1.getYear(&c1);例:有理数类的定义例:有理数类的定义#include class CRation long n;/分子分子long d;/分母分母public:CRation(long,long);/构造构造void Print();/输出输出void Gcd();/约分约分;CRation:CRation(long n,long d)/对象创建时被调用对象创建

7、时被调用this-n=n;/this是指向当前对象的指针是指向当前对象的指针this-d=d;void CRation:Print(void)cout n /d endl;void CRation:Gcd()int x=n,y=d,t;if(x y)t=x;x=y;y=t;t=x%y;while(t!=0)x=y;y=t;t=x%y;n/=y;d/=y;main()CRation r(18,27);/分配空间,调构造函数分配空间,调构造函数 r.Print();/输出输出 r.Gcd();/约分约分 r.Print();例:动态整数数组类例:动态整数数组类n作为对象的数组作为对象的数组n唯一标

8、识的实体唯一标识的实体n封装数组元素、封装数组元素、元素个数等信息元素个数等信息n责任功能责任功能n按照下标的访问按照下标的访问n数组大小可变数组大小可变n可获取元素个数可获取元素个数#include#include class Arrayint *pElems;int size;/个数个数public:Array(int n);/构造构造Array(void);/析构析构void SetAt(int i,int v);int GetAt(int i);/存取存取int GetSize(void);类设计要点类设计要点n独立性独立性n表示独立的实体表示独立的实体n以属性表示其特征以属性表示其特

9、征n以行为表示其担负的责任(功能、服务)以行为表示其担负的责任(功能、服务)n封装性封装性n不开放属性不开放属性n提供足够的方法,支持各种用途提供足够的方法,支持各种用途n隐蔽内部数据结构隐蔽内部数据结构n隐蔽方法的内部算法隐蔽方法的内部算法n复用性复用性n适用性强、功能丰富适用性强、功能丰富方法的实现(方法的实现(1/2)Array:Array(int n)/构造构造n元素的数组元素的数组pElems=new int n;/动态生成动态生成size=n;Array:Array(void)/撤消前被自动调用撤消前被自动调用delete pElems;/释放空间释放空间int Array:Get

10、Size(void)return size;/获得数组大小获得数组大小方法的实现(方法的实现(2/2)void Array:SetAt(int i,int v)/按下标按下标 i 赋值赋值 vif(i=size)/超过范围超过范围 int*p =new int size+5;/开辟空间,复制数据开辟空间,复制数据 memcpy(p,pElems,size*sizeof(int);size+=5;delete pElems;/释放原数组空间释放原数组空间 pElems=p;/保存首地址保存首地址*(pElems+i)=v;/赋值赋值int Array:GetAt(int i)/按下标按下标 i

11、取元素数据取元素数据return i size?*(pElems+i):0;动态数组的使用动态数组的使用void main()int n;Array x(10);/数组对象实例变量数组对象实例变量for(int i=0;i20;i+)cout n;x.SetAt(i,n);for(i=0;ix.GetSize();i+)cout x.GetAt(i);程序分析程序分析n对象类对象类=数据结构数据结构+相关函数相关函数n属性属性=结构分量结构分量n方法方法=作用于结构的函数作用于结构的函数n对象实例变量对象实例变量n静态构造静态构造 局部变量、全局变量局部变量、全局变量n动态构造动态构造 new

12、 new 类名(参数表)类名(参数表)n函数定义函数定义n标识所属的类标识所属的类n可以直接访问参数和本类的数据成员可以直接访问参数和本类的数据成员n函数调用函数调用n通过对象实例调用其方法通过对象实例调用其方法消息传递消息传递n对象方法的激活对象方法的激活n使用者向对象实例发消息使用者向对象实例发消息n对象用方法函数响应消息对象用方法函数响应消息n消息的组成消息的组成n消息名消息名 函数名函数名n消息属性消息属性 参数值的列表参数值的列表n核心点核心点n使用者仅关心消息的组成使用者仅关心消息的组成n对象决定哪个方法负责响应对象决定哪个方法负责响应消息传递消息传递n消息响应消息响应n不同类可以

13、有同名方法函数不同类可以有同名方法函数n同类中可以有原型不同的方法同类中可以有原型不同的方法n消息响应方法的选择消息响应方法的选择1.消息名消息名=方法名方法名2.接收消息的对象(对象类)接收消息的对象(对象类)3.匹配函数原型(参数个数、参数类型)匹配函数原型(参数个数、参数类型)对象成员n一个类的对象作为另一个类的数据成员一个类的对象作为另一个类的数据成员class X 类名1 成员名1 类名2 成员名2 .;构造函数 X:X(参数表0):成员1(参数表1),成员2(参数表2).n建立X类对象时,先调对象成员的构造函数,然后才执行X类的构造函数n对象成员构造函数的调用顺序取决于这些对象成员

14、在类中的说明顺序n析构函数的调用顺序与构造函数相反#include Date.hclass Student_Info int No;char Name20;char Sex;Date Birthday;public:Student_Info(int n,char*a,char s,int y,int m,int d);Student_Info();int GetNo();char*GetName();char GetSex();#include Student.hStudent_Info:Student_Info(int n,char*a,char s,int y,int m,int d):B

15、irthday(y,m,d)No=n;strcpy(Name,a);Sex=s;Student_Info:Student_Info():Birthday(2000,1,1)No=0;strcpy(Name,);Sex=m;程序结构n一般分为三个文件:1)将类的说明作为头文件 .h2)将类的成员函数的实现放一个文件 .cpp3)对类的使用放一个文件,包括main .cppn作业:n定义日期类n定义描述书的类,包括书名、价格、出版日期等第三章 继承n现实世界中的一般特殊关系现实世界中的一般特殊关系n人人 学生学生n人人 教师教师n类的继承类的继承n学生类继承人类学生类继承人类n教师类继承人类教师类

16、继承人类n派生类:描述特殊的属性和行为派生类:描述特殊的属性和行为n基类:描述一般的属性和行为基类:描述一般的属性和行为C+语言对继承的支持语言对继承的支持class 派生类派生类 :public 基类基类/特殊属性特殊属性/特殊方法特殊方法;派生类继承了基类的属性和方法派生类继承了基类的属性和方法支持软件模块的复用支持软件模块的复用n复用了基类的数据结构和成员函数复用了基类的数据结构和成员函数n【例】【例】分别定义一个描述圆的类Circle和描述一个圆柱体的类Cylinder。#ifndef Circle_H#define Circle_Hclass Circle /定义圆类 protect

17、ed:double radius;public:Circle(double r)radius=r;void setradius(double r)radius=r;double getradius()return radius;double area()return 3.14*radius*radius;#endif#include Circle.hclass Cylinder:public Circle /定义圆柱体类 double height;public:Cylinder(double r,double h);void setheight(double h);double gethei

18、ght();double area();/重新定义area()函数 ;#include Cylinder.hCylinder:Cylinder(double r,double h):Circle(r)height=h;void Cylinder:setheight(double h)height=h;double Cylinder:getheight()return height;double Cylinder:area()/重新定义area()函数 return 2*Circle:area()+2*3.14*radius*height;#include#include Cylinder.h#

19、include Circle.hvoid main()Circle s1(10);Cylinder s2(2,5);cout圆柱体表面积:s2.area()endl;cout圆的面积是:s1.area()endl;n在创建派生类的对象时,由于派生类的对象包含了基类的数据成员,因此派生类的构造函数除初始化其自身定义的数据成员外,还必须对基类中的数据成员进行初始化,也就是说,派生类的构造函数要负责调用基类的构造函数。n派生类的构造函数的定义格式如下:派生类名:派生类构造函数名(参数表):基类构造函数名(参数表)n基类的对象只能调用基类的成员函数,不能调用派生类的成员函数n在定义派生类的对象时,系统

20、首先执行基类的构造函数,然后执行派生类的构造函数。而系统执行析构函数的顺序恰恰相反,即先执行派生类的析构函数,再执行基类的析构函数n若在基类中没有定义任何构造函数,这时在派生类的构造函数的定义中可以省略对基类构造函数的调用,此时系统将去调用基类的默认构造函数。多继承n定义多继承类的方式:class 派生类名:访问方式 基类1,访问方式 基类2 ;n 其中:访问方式同单继承n多继承下派生类的构造函数必须同时负责所有基类构造函数的调用n在多继承下,派生类构造函数的定义格式:派生类构造函数名(参数表):基类名1(参数表1),n在多继承下,系统首先执行各基类的构造函数,然后再执行派生类的构造函数,处于

21、同一层次的各基类构造函数的执行顺序与声明派生类时所指定的各基类顺序一致,而与派生类的构造函数定义中所调用基类构造函数的顺序无关。第四章 多态性与虚函数多态性与虚函数n多态性多态性n不同事物以不同方式响应同一消息不同事物以不同方式响应同一消息n 演出演出n发消息发消息“暂停暂停”给给 比赛比赛n 会议会议n产生不同的消息响应产生不同的消息响应n消息响应消息响应n取决于接受消息的对象,而不是发送者取决于接受消息的对象,而不是发送者【例】【例】#include class A int a;public:A(int i=0)a=i;void print();void A:print()coutIn c

22、lass A,print()is called.endl;class B:public A int b;public:B(int j=-1)b=j;void print();void B:print()coutIn class B,print()is called.print();pb=&b;pb-print();pa=&b;/基类指针可以指向派生类对象 pa-print();void commfun(A&aref)aref.print();void main()A a;a.print();commfun(a);/以基类A的对象a作实参 B b;b.print();commfun(b);/以派

23、生类B的对象b作实参 n分析:在派生类B中继承了基类A的成员函数print(),又定义了一个同名的print()函数。n这种改变在静态联编的基础上编译器并不知道。n必须通知编译器这种可能的改变,即需要进行动态联编。其方法就是在基类中将可能发生改变的成员函数声明为虚函数。虚函数虚函数n声明虚函数的方法是在基类中的成员函数原型前加上关键字virtual。n其格式如下:class 类名 virtual 类型 函数名(参数表);;n当一个类的成员函数说明为虚函数后,在该类的派生类中定义与其基类虚函数原型相同的函数。n这时,当用基类指针指向这些派生类对象时,系统会在程序运行中根据所指对象的不同,自动选择

24、派生类中的同名函数来代替基类中的虚函数。n虚函数在派生类中重新定义时,必须与基类中的函数原型完全相同,包括函数名、返回类型、参数个数和参数类型的顺序。这时无论在派生类的相应成员函数前是否加上关键字virtual,都将视其为虚函数。n如果函数原型不同,只是函数名相同,C+将视其为一般的函数重载,而不是虚函数。#include class Ppublic:virtual void print()coutParentClassendl;class A:public Ppublic:virtual void print()coutSubClass1endl;class B:public Ppublic

25、:virtual void print()coutSubClass2print();s1=&obj2;s1-print();通过指针class Apublic:virtual void Print()coutParentendl;class B:public Apublic:virtual void Print()coutSubclassendl;void show(A&a)a.Print();通过引用void main()B b;show(b);纯虚函数纯虚函数n在基类中只声明虚函数而不给出具体的函数定义体,将它的具体定义放在各派生类中,称此虚函数为纯虚函数。n通过该基类的指针或引用就可以调

26、用所有派生类的虚函数,基类只是用于继承,仅作为一个接口,具体功能在派生类中实现。n形式:virtual 类型 函数名(参数表)=0;抽象类n若一个类至少有一个纯虚函数,就称该类为抽象类。n抽象类中可以有多个纯虚函数,也可以定义其他非纯虚函数。n不能声明抽象类的对象,但可以声明指向抽象类的指针变量和引用变量。n如果派生类中没有重新定义基类中的纯虚函数,则在派生类中必须再将该虚函数声明为纯虚函数。n从抽象类可以派生出具体或抽象类。n引入抽象类的目的,主要是为了能将相关类组织在一个类继承结构中,并通过抽象类来为这些相关类提供统一的操作接口。n【例】【例】设计一个抽象类shape,它表示具有形状的东西

27、,体现了抽象的概念,在它下面可以派生出多种具体形状,比如三角形、矩形。#includeclass Shape protected:double x,y;public:void set(double i,double j)x=i;y=j;virtual void area()=0;/声明纯虚函数 ;class Triangle:public Shape public:void area()cout 三角形面积:0.5*x*yendl;class Rectangle:public Shape public:void area()cout矩形面积:x*y=used)return-1;/超界处理超界处

28、理returnpData idx;void IntArray:Add(int val)if(used=size)/扩大数组的尺寸(扩大数组的尺寸(+8)int *p=new int size+8;memcpy(p,pData,sizeof(int)*size);delete pData;/释放原空间释放原空间pData=p;/新的空间新的空间size+=8;pData used+=val;/添加元素添加元素IntList 的实现的实现IntList:IntList()pHead=NULL;int IntList:GetNumber(void)int n=0;for(Node*p=pHead;p

29、!=NULL;p=p-next)n+;/元素的计数元素的计数return n;int IntList:GetAt(int idx)for(Node*p=pHead;p!=NULL;p=p-next)if(idx-=0)return p-val;/找到指定元素找到指定元素return -1;void IntList:Add(int val)Node*p=new Node();p-val=val;/构造新结点构造新结点p-next=NULL;if(pHead=NULL)/空表?空表?pHead=p;return;for(Node*q=pHead;q-next!=NULL;q=q-next);q-next=p;/加在表尾加在表尾int sum(IntContainer*pSet)int s=0;for(int i=0;iGetNumber();i+)s+=pSet-GetAt(pSet);return s;main()IntArray ar(10);IntList ls;ar.Add(10);ar.Add(23);ar.Add(32);ls.Add(10);ls.Add(23);ls.Add(32);int s1=sum(&ar);int s2=sum(&ls);couts1endls2;

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

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(《C类和对象》课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|