第21讲 构造函数和析构函数优秀课件.ppt

上传人:石*** 文档编号:91096726 上传时间:2023-05-21 格式:PPT 页数:32 大小:5.14MB
返回 下载 相关 举报
第21讲 构造函数和析构函数优秀课件.ppt_第1页
第1页 / 共32页
第21讲 构造函数和析构函数优秀课件.ppt_第2页
第2页 / 共32页
点击查看更多>>
资源描述

《第21讲 构造函数和析构函数优秀课件.ppt》由会员分享,可在线阅读,更多相关《第21讲 构造函数和析构函数优秀课件.ppt(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第21 讲 构造函数和析构函数第1 页,本讲稿共32 页第二十一讲第二十一讲 构造函数和析构函数构造函数和析构函数 构造函数 拷贝构造函数 析构函数 类的组合第2 页,本讲稿共32 页一、构造函数P211 功能:对成员变量自动进行初始化。特性:1必须与所属类同名,无返回值也无函数类型名,即使是void也不行。即构造函数的定义格式为:类名(参数表)函数体 第3 页,本讲稿共32 页2创建对象时,由系统自动调用构造函数,程序中不可直接调用。特性:一、构造函数class Rect/矩形类 private:int LeftX,TopY,RightX,BottomY;public:Rect(int l,

2、int t,int r,int b);/构造函数 Rect:Rect(int l,int t,int r,int b)LeftX=l;TopY=t;RightX=r;BottomY=b;void main()Rect rec(2,4,6,2);创建对象rec时,系统自动调用构造函数Rect,并用实参初始化4个私有成员变量。第4 页,本讲稿共32 页3构造函数必须是公有成员,可在类内或类外定义。4构造函数可以重载。特性:一、构造函数P214第5 页,本讲稿共32 页一、构造函数class Rect/矩形类 private:int LeftX,TopY,RightX,BottomY;public:

3、Rect()LeftX=TopY=RightX=BottomY=0;/构造函数 Rect(int l,int t,int r,int b);/构造函数 void main()Rect rec1(2,4,6,2),rec2;创建对象rec2时未给出初始值,系统自动调用无参构造函数Rect(),4个私有成员变量被初始化为0。第6 页,本讲稿共32 页一、构造函数5若类中未定义构造函数,系统会自动生成一个隐含的空构造函数:称为缺省构造函数。特性:类名()第7 页,本讲稿共32 页e.g.21_1 分析程序运行结果。#includeusing namespace std;int n=0;class M

4、yClass private:int a,b;public:MyClass(int i,int j);/有参构造函数 MyClass();/无参构造函数 void show();第8 页,本讲稿共32 页MyClass:MyClass(int i,int j)a=i;b=j;n+;coutn“:执行有参构造函数endl;MyClass:MyClass()a=0;b=0;n+;coutn“:执行无参构造函数endl;void MyClass:show()couta=a,b=bendl;第9 页,本讲稿共32 页void main()MyClass ob2;MyClass ob1(10,5),*p

5、;p=new MyClass(100,200);ob1.show();(*p).show();p-show();ob0=ob1;ob0.show();delete p;创建对象数组时,对每个对象元素自动调用构造函数 使用new创建动态对象时,自动调用构造函数 第10 页,本讲稿共32 页一、构造函数类名(形参定义表):成员变量1(形参1),成员变量2(形参2)成员变量n(形参n)构造函数的初始化表class Point/点类 private:int x,y;public:Point(int,int);/构造函数 Point:Point(int xx,int yy):x(xx),y(yy)第11

6、 页,本讲稿共32 页创建新对象A时,若用另一个对象B来初始化,需使用拷贝构造函数将B的值传给A。如:Rect rec1(2,4,6,2),rec2(rec1);二、拷贝构造函数拷贝构造函数是一种特殊的构造函数,其形参为本类对象的引用。用rec1的值初始化rec2第12 页,本讲稿共32 页 若类中未定义拷贝构造函数,系统会自动生成一个隐含的拷贝构造函数:1.缺省拷贝构造函数类名(类名&x)*this=x;二、拷贝构造函数 功能:将对象x赋给被初始化对象。第13 页,本讲稿共32 页e.g.21_2 分析程序运行结果。#include#include using namespace std;c

7、lass MyClass private:char*buf;public:MyClass(char*inf=NULL);/构造函数 void set(char*s);void DeleteBuf();void show();第14 页,本讲稿共32 页MyClass:MyClass(char*inf)/构造函数 if(!inf)buf=NULL;return;buf=new charstrlen(inf)+1;strcpy(buf,inf);void MyClass:set(char*s)/赋值 if(buf)delete buf;buf=new charstrlen(s)+1;strcpy(

8、buf,s);void MyClass:DeleteBuf()/释放内存 if(buf)delete buf;第15 页,本讲稿共32 页void MyClass:show()/显示结果 if(buf)coutbufendl;void main()MyClass ob1(“Hello”),ob2(ob1);/*创建ob1时系统调用构造函数 ob1.show();创建ob2时系统调用缺省拷贝构造函数*/ob2.show();/ob1.DeleteBuf();/ob2.show();ob2.set(OK);ob2.show();/若执行这两句话,程序运行终止第16 页,本讲稿共32 页二、拷贝构造

9、函数2.自定义拷贝构造函数类名(类名&参数)函数体 说明:1创建新对象时,若用另一个对象来初始化,系统将自动调用自定义拷贝构造函数;若未自定义,则调用缺省拷贝构造函数。2当类中含有指针成员且需为其动态分配内存,一般应自定义拷贝构造函数。第17 页,本讲稿共32 页e.g.21_3 上例的拷贝构造函数。MyClass:MyClass(MyClass&x)buf=new charstrlen(x.buf)+1;strcpy(buf,x.buf);第18 页,本讲稿共32 页三、析构函数P220 功能:撤消对象时释放对象占用的资源。特性:1必须与所属类同名,之前加上“”号,无返回值、无函数类型名也无

10、参数。即析构函数的定义格式为:类名()函数体 第19 页,本讲稿共32 页2撤销对象时,由系统自动调用。若类中未定义析构函数,系统会自动生成一个隐含的空析构函数:称为缺省析构函数。特性:三、析构函数类名()如果在构造函数中通过new运算符动态申请了内存空间,需自定义析构函数显式地使用delete运算符释放该内存空间。第20 页,本讲稿共32 页class MyClass private:char*buf;public:MyClass(char*inf=NULL);MyClass();MyClass:MyClass(char*inf)/构造函数 if(!inf)buf=NULL;return;b

11、uf=new charstrlen(inf)+1;strcpy(buf,inf);MyClass:MyClass()/析构函数 if(buf)delete buf;第21 页,本讲稿共32 页3析构函数必须是公有成员,可在类内或类外定义。4析构函数不可重载。特性:三、析构函数第22 页,本讲稿共32 页e.g.21_4 一圆形游泳池如图所示,现在需在其周围建一圆形过道,并在其四周围上栅栏。栅栏价格为35元/米,过道造价为20元/平方米。过道宽度为3米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。游泳池过道第23 页,本讲稿共32 页#includeusing namespace

12、std;const double pi=3.14159;const float FencePrice=35;const float CorridorPrice=20;class Circle/声明类Circle及其数据和方法 private:float radius;public:Circle(float r);/构造函数 float Circumference();/圆周长 float Area();/圆面积;第24 页,本讲稿共32 页/构造函数初始化数据成员radiusCircle:Circle(float r)radius=r;/计算圆的周长float Circle:Circumfer

13、ence()return 2*pi*radius;/计算圆的面积 float Circle:Area()return pi*radius*radius;第25 页,本讲稿共32 页void main()float radius;float FenceCost,CorridorCost;coutradius;Circle Pool(radius);/创建Circle对象,表示游泳池Circle PoolCor(radius+3);/游泳池及过道/计算栅栏造价并输出FenceCost=PoolCor.Circumference()*FencePrice;cout栅栏造价为:¥FenceCosten

14、dl;/计算过道造价并输出CorridorCost=(PoolCor.Area()-Pool.Area()*CorridorPrice;cout过道造价为:¥CorridorCostendl;第26 页,本讲稿共32 页四、类的组合类中的数据成员是另一个类对象。class Point private:float x,y;/点的坐标 public:Point(float h,float v);/构造函数 float GetX();/取X坐标 float GetY();/取Y坐标;/函数的实现略class Line private:Point p1,p2;public:Line(Point a,P

15、oint b);/函数的实现略P204第27 页,本讲稿共32 页四、类的组合 组合类的构造函数功能:对基本类型成员和对象成员进行初始化。定义格式:类名(形参表):对象1(形参1).,成员变量1(形参1).包括初始化对象成员和初始化基本类型成员时所需的形参。第28 页,本讲稿共32 页如:class Part/部件类 public:Part();Part(int v);Part();void Print();private:int val;第29 页,本讲稿共32 页30class Whole public:Whole();Whole(int i,int j,int k);Whole();vo

16、id Print();private:Part one;Part two;int date;第30 页,本讲稿共32 页31Whole:Whole()/无参构造函数 date=0;/有参构造函数Whole:Whole(int i,int j,int k):two(i),one(j),date(k)/其他函数的实现略第31 页,本讲稿共32 页四、类的组合 组合类构造函数的调用 构造函数调用顺序:先调用对象成员的构造函数(按声明顺序,先声明者先构造);然后调用本类的构造函数。(析构函数的调用顺序相反)若调用缺省构造函数(即无参构造函数),则对象成员的初始化也将调用相应的缺省构造函数。第32 页,本讲稿共32 页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 资格考试

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁