第3章类与对象课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第3章类与对象课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 对象 课件
- 资源描述:
-
1、二二0一二年三月一二年三月第第3章章 类类与对象与对象o 本章主要介绍类与对象。本章主要介绍类与对象。o 类(类(class)是面向对象程序设计的核心)是面向对象程序设计的核心,是实现数据封装和信息隐藏的工具,是继是实现数据封装和信息隐藏的工具,是继承和多态的基础。承和多态的基础。o 本章是全书的基础与重点本章是全书的基础与重点,也是学习面向,也是学习面向对象程序设计技术的基础。对象程序设计技术的基础。1、C对对C结构的扩展结构的扩展o最初的C+称为“带类的C”,它扩展了C语言结构的功能,结构不仅可以包含数据,而且还可以包含操作这些数据的函数。【例3-1】一个包含了数据和数据操作函数的复数结构
2、。/Eg3-1.cppstruct Complexdouble r;double i;void init(double rr,double ii)r=rr;i=ii;double real()return r;double image()return i;1、引入类的原因、引入类的原因n解除struct的不安全性(struct成员的默认访问权限是public)n区别于struct2、类的定义形式、类的定义形式class 类名类名public:公有成员说明;公有成员说明;protected:保护成员说明;保护成员说明;private:私有成员说明;私有成员说明;;【例例3-2】用用class定义
3、的复数类定义的复数类Complex。/Eg3-2.cpp#include class Complexprivate:double r;double i;public:void init(double rr,double ii)r=rr;i=ii;double real()return r;double image()return i;void main()Complex a;a.init(2,3);couta.real()+“a.image()i“setHour(10);pClock-dispTime();3.4 对象对象4、对象赋值对象名1对象名2;Clock*pa,*pb,aClock,b
4、Clock;bClock=aClock;pa=new Clock;pb=pa;1、两个对象必须、两个对象必须类型相同类型相同2、进行数据成员的、进行数据成员的值拷贝值拷贝,赋值之后,两不相干赋值之后,两不相干3、若对象有、若对象有指针数据成员,指针数据成员,赋值可能产生问题赋值可能产生问题3.4 对象对象3.5 构造函数与析构函数构造函数与析构函数o 构造函数与析构函数是两个极其特殊的函数,它们由系统自动执行系统自动执行,在程序中不可显示地调用它们不可显示地调用它们。理解这两个函数对学好面向对象程序设计技术是大有帮助的。o 构造函数构造函数的主要作用是用于建立对象时对对象的数数据成员进行初始化
5、据成员进行初始化;而析构函数析构函数主要用于对象生命对象生命期结束时回收对象期结束时回收对象。3.5.1 构造构造函数函数1、构造函数的概念、构造函数的概念构造函数(constructor)是与类同名的特殊成员函数,主要用来初始化对象的数据成员。其在类中的定义形式如下:class X X();3.5.1 构造构造函数函数2、构造函数的特点、构造函数的特点n 构造函数与类同名。构造函数与类同名。n 构造函数没有返回类型。构造函数没有返回类型。n 构造函数可以被重载。构造函数可以被重载。n 构造函数由系统自动调用,不允许在程序中显构造函数由系统自动调用,不允许在程序中显式调用。式调用。o 引用构造
6、函数的原因引用构造函数的原因n 自动完成数据成员初始化,减少出错几率3、构造函数的调用n只能在定义对象时,由系统自动调用系统自动调用!n调用形式:类名类名 对象名(参数表);对象名(参数表);o 系统将根据参数表调用某个构造函数系统将根据参数表调用某个构造函数o 若无参数表将调用缺省构造函数。若无参数表将调用缺省构造函数。n不允许不允许程序员在程序中显示调用构造函数的名称,任何时候都不允许!3.5.1 构造构造函数函数3.5.1 构造构造函数函数【例例3-4】一个桌子类的构造函数。一个桌子类的构造函数。/Eg3-4.cpp#include using namespace std;class D
7、eskpublic:Desk(int,int,int,int);/构造函数声明构造函数声明 void setWeight(int w)weight=w;private:int weight,length,width,high;Desk:Desk(int ww,int l,int w,int h)/构造函数定义构造函数定义 weight=ww;high=l;width=w;length=h;coutcall constructor !endl;void main()Desk d1(2,3,3,5);3.5.1 构造构造函数函数4、使用构函数函数应注意的问题、使用构函数函数应注意的问题 构造函数不
8、能有返回类型,即使构造函数不能有返回类型,即使void也不行。也不行。构造函数由系统自动调用,不能在程序中显式调构造函数由系统自动调用,不能在程序中显式调用构造函数。用构造函数。构造函数的调用时机是定义对象之后的第一时间,构造函数的调用时机是定义对象之后的第一时间,即构造函数是对象的第一个被调用函数。即构造函数是对象的第一个被调用函数。定义对象数组或用定义对象数组或用new创建动态对象时,也要调创建动态对象时,也要调用构造函数。但定义数组对象时,必须有不需要用构造函数。但定义数组对象时,必须有不需要参数的构造函数参数的构造函数 构造函数通常应定义为公有成员。构造函数通常应定义为公有成员。1、析
9、构函数的概念、析构函数的概念析构函数(destructor)是与类同名的另一个特殊成员函数,作用与构造函数相反,用于在对象生存期结束时,完成对象的清理工作。2、定义语法、定义语法class XX();3、析构函数特点、析构函数特点o函数名为函数名为加类名加类名o无参数无参数o无返回值无返回值o不能重载:每个类仅有一个析构函数不能重载:每个类仅有一个析构函数3.5.2 析构析构函数函数4 4、析构函数、析构函数调用时机调用时机对象生命期结束时自动调用对象生命期结束时自动调用自动自动/局部对象:定义的语句块结束处局部对象:定义的语句块结束处全局对象:程序结束时全局对象:程序结束时静态对象:程序结束
10、时静态对象:程序结束时3.5.2 析构析构函数函数【例例3-5】析构函数和构造函数的应用。析构函数和构造函数的应用。/Eg3-5.cpp#include using namespace std;class Aprivate:int i;public:A(int x)i=x;coutconstructor:iendl;A()coutdestructor:iendl;void main()A a1(1);A a2(2);A a3(3);A a4(4);3.5.2 析构函数析构函数5、使用析构说明、使用析构说明 若有多个对象同时结束生存期,若有多个对象同时结束生存期,C+将按照将按照与调与调用构造函
11、数相反的次序调用析构函数。用构造函数相反的次序调用析构函数。每个类都应该有一个析构函数,如果没有显式定每个类都应该有一个析构函数,如果没有显式定义析构函数。义析构函数。C+将产生一个最小化的将产生一个最小化的默认析默认析构函数。构函数。构造函数和析构函数都可以是构造函数和析构函数都可以是inline函数函数 在通常情况下,析构函数与构造函数都应该被设在通常情况下,析构函数与构造函数都应该被设置为置为类的公有成员。类的公有成员。3.5.2 析构析构函数函数3.5.2 析构析构函数函数【例3-6】用析构函数释放构造函数分配的自由存储空间。#include using namespace std;c
12、lass Bprivate:int*a;char*pc;public:B(int x)a=new int10;pc=new char;B()delete a;delete pc;void main()B x(1);3.5.2 无参无参构造函数构造函数o 无参数构造函数指在定义对象时,不需要无参数构造函数指在定义对象时,不需要提供参数的构造函数。在一些情况下提供参数的构造函数。在一些情况下,如定如定义数组义数组,必须使用无参构造函数,因此需要必须使用无参构造函数,因此需要引起重视。引起重视。3.5.2 无参无参构造函数构造函数1、系统默认构造函数、系统默认构造函数C+规定,每个类必须有构造函数,
13、如果一个类没有定规定,每个类必须有构造函数,如果一个类没有定义任何构造函数,在义任何构造函数,在需要需要时编译器将会为它生成一个时编译器将会为它生成一个默认构造默认构造函数。函数。class X X()/系统默认构造函数类似于此系统默认构造函数类似于此 在用默认构造函数创建对象时,如果创建的是在用默认构造函数创建对象时,如果创建的是全局对象全局对象或静态对象或静态对象,则对象所有数据成员,则对象所有数据成员初始化为初始化为0;如果;如果创建的是创建的是局部对象局部对象,即,即不进行对象数据成员的初始化不进行对象数据成员的初始化。3.5.2 无参无参构造函数构造函数【例例3-7】point类的默
14、认构造函数。类的默认构造函数。/Eg3-7.cpp#include using namespace std;class pointprivate:int x,y;public:void setpoint(int a,int b)x=a;y=b;int getx()return x;int gety()return y;point p1;/定义全局对象定义全局对象void main()static point p2;/定义静态局部对象定义静态局部对象 point p3;/定义局部对象定义局部对象 coutp1:p1.getx(),p1.gety()endl;coutp2:p2.getx(),p2
15、.gety()endl;coutp3:p3.getx(),p3.gety()endl;o说明:在类没有定义任何构造函数时,系统才会产生默认构造函数。说明:在类没有定义任何构造函数时,系统才会产生默认构造函数。o一旦定义了任何形式的构造函数,系统就不再产生默认构造函数。一旦定义了任何形式的构造函数,系统就不再产生默认构造函数。【例例3-8】未定义无参构造函数引发的错误。未定义无参构造函数引发的错误。#include using namespace std;class pointprivate:int x,y;public:point(int a,int b)x=a;y=b;/;point p1;
16、void main()static point p2;point p3,*p4,a10;p4=new point;2、重定义无参数构造函数、重定义无参数构造函数o 系统生成的默认无参数构造函数,并未对系统生成的默认无参数构造函数,并未对对象的数据成员作什么实际的初始化工作。对象的数据成员作什么实际的初始化工作。o C+允许允许显式定义显式定义无参数的构造函数,这无参数的构造函数,这样就能通过它为对象的数据成员提供初始样就能通过它为对象的数据成员提供初始值。值。o 有时为了让类能够正常工作,必须显示提有时为了让类能够正常工作,必须显示提供无参构造函数,如例供无参构造函数,如例3-8。3.5.2
17、无参构造函数无参构造函数o 注意注意1.在在class没有定义任何构造函数时,系统没有定义任何构造函数时,系统可能动会产生缺省无参构造函数。可能动会产生缺省无参构造函数。2.一旦定义了任意的构造函数。系统就不会一旦定义了任意的构造函数。系统就不会产生缺省的无参构造函数产生缺省的无参构造函数3.5.2 无参无参构造函数构造函数【例例3-9】定义定义Point类的无参数构造函数,将类的无参数构造函数,将point对象的数据成员初始化为对象的数据成员初始化为0。#include using namespace std;class pointprivate:int x,y;public:point(i
18、nt a,int b)x=a;y=b;int getx()return x;int gety()return y;point()x=0;y=0;/显式定义无参构造函数显式定义无参构造函数;point p1(1,1);/调用构造函数调用构造函数point(int,int)void main()static point p2;/调用构造函数调用构造函数point()point p3,a10;/调用构造函数调用构造函数point()point *p4;p4=new point;/调用构造函数调用构造函数point()coutp1:p1.getx(),p1.gety()endl;coutp2:p2.g
19、etx(),p2.gety()endl;coutp3:p3.getx(),p3.gety()endl;coutp4:getx(),gety()endl;3.5.2 定义定义缺省参数构造函数缺省参数构造函数o在数据成员的取值比较固定时,可以通过为构造函数参数提在数据成员的取值比较固定时,可以通过为构造函数参数提供缺省参数初始化它们。供缺省参数初始化它们。o【例3-10】定义point类的缺省参数构造函数。/Eg3-10.cpp#include using namespace std;class pointprivate:int x,y;public:point(int a=0,int b=0)x
20、=a;y=b;/缺省参数构造函数 int getx()return x;int gety()return y;o构造函数可以重载。与普通函数的重载一样,重载的构造函构造函数可以重载。与普通函数的重载一样,重载的构造函数必须具有不同的函数原型数必须具有不同的函数原型o【例【例3-12】有一日期类,重载其构造函数。有一日期类,重载其构造函数。class Tdatepublic:Tdate();Tdate(int d);Tdate(int m,int d);Tdate(int m,int d,int y);/其他公共成员其他公共成员protected:int month;int day;int ye
21、ar;3.5.3 重载重载构造函数构造函数Tdate:Tdate()month=4;day=15;year=1995;cout month/day/year endl;Tdate:Tdate(int d)month=4;day=d;year=1996;cout month/day/year endl;Tdate:Tdate(int m,int d)month=m;day=d;year=1997;cout month/day/year endl;Tdate:Tdate(int m,int d,int y)month=m;day=d;year=y;cout month/day/year endl;
22、3.5.3 重载重载构造函数构造函数void main()Tdate aday;Tdate bday(10);Tdate cday(2,12);Tdate dday(1,2,1998);3.5.3 重载重载构造函数构造函数3.5.4 拷贝构造函数拷贝构造函数1、什么是拷贝构造函数、什么是拷贝构造函数拷贝构造函数是一个特殊的构造函数,用于根据已存在的对象初始化一个建新对象。它的形式如下:class Xpublic:X(const X&);/拷贝构造函数的常见原型3.5.4 拷贝拷贝构造函数构造函数2、默认拷贝构造函数、默认拷贝构造函数n如果没有定义类的拷贝构造函数,在需要的时候,如果没有定义类的
23、拷贝构造函数,在需要的时候,C+将产生一个具有最小功能的默认拷贝构造函数,将产生一个具有最小功能的默认拷贝构造函数,类似于下面的形式:类似于下面的形式:X:X(const X&)n默认拷贝构造函数以成员按位拷贝(bit-by-bit)的方式实现成员的复制。当一个类有指针类型的数据成员时,默认拷贝构造函数常会产生指针悬挂问题指针悬挂问题。3.5.4 拷贝拷贝构造函数构造函数【例例3-13】默认拷贝构造函数引起的指针悬挂问题。默认拷贝构造函数引起的指针悬挂问题。/Eg3-13.cpp#include#includeusing namespace std;class Personprivate:ch
展开阅读全文