第21讲 构造函数和析构函数精.ppt

上传人:石*** 文档编号:65263534 上传时间:2022-12-04 格式:PPT 页数:32 大小:5.27MB
返回 下载 相关 举报
第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页,本讲稿

2、共32页2创建对象时,由系统自动调用构造函数,创建对象时,由系统自动调用构造函数,程序中不可直接调用。程序中不可直接调用。特性:特性:一、构造函数一、构造函数class Rect /矩形类矩形类 private:int LeftX,TopY,RightX,BottomY;public:Rect(int l,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时,系统时,系统自

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

4、 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 分析程序运行结果。分析程序运行结果。#incl

5、udeusing namespace std;int n=0;class MyClass 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,

6、b=bshow();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);/构造函数构造函数

7、Point:Point(int xx,int yy):x(xx),y(yy)第11页,本讲稿共32页创建新对象创建新对象A时,若用另一个对象时,若用另一个对象B来来初始化,需使用初始化,需使用拷贝构造函数拷贝构造函数将将B的的值传给值传给A。如:如:Rect rec1(2,4,6,2),rec2(rec1);二、拷贝构造函数二、拷贝构造函数拷贝构造函数是一种特殊的构造函数,其拷贝构造函数是一种特殊的构造函数,其形参为本类对象的引用。用用rec1的值初的值初始化始化rec2第12页,本讲稿共32页 若类中未定义拷贝构造函数,系统会自若类中未定义拷贝构造函数,系统会自动生成一个隐含的拷贝构造函数:

8、动生成一个隐含的拷贝构造函数:1.缺省拷贝构造函数缺省拷贝构造函数类名类名(类名类名&x)*this=x;二、拷贝构造函数二、拷贝构造函数 功能:将对象功能:将对象x赋给被初始化对象。赋给被初始化对象。第13页,本讲稿共32页e.g.21_2 分析程序运行结果。分析程序运行结果。#include#include using namespace std;class MyClass private:char *buf;public:MyClass(char*inf=NULL);/构造函数构造函数 void set(char*s);void DeleteBuf();void show();第14页,

9、本讲稿共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(buf,s);void MyClass:DeleteBuf()/释放内存释放内存 if(buf)delete buf;第15页,本讲稿共32页void MyClass:show()/显示结果显示结果 if(buf)coutbu

10、fendl;void main()MyClass ob1(“Hello”),ob2(ob1);/*创建创建ob1时系统调用构造函数时系统调用构造函数 ob1.show();创建创建ob2时系统调用缺省拷贝构造函数时系统调用缺省拷贝构造函数*/ob2.show();/ob1.DeleteBuf();/ob2.show();ob2.set(OK);ob2.show();/若执行这两句话,程序运行终止若执行这两句话,程序运行终止第16页,本讲稿共32页二、拷贝构造函数二、拷贝构造函数2.自定义拷贝构造函数自定义拷贝构造函数类名类名(类名类名&参数参数)函数体函数体 说明:说明:1创建新对象时,若用另

11、一个对象来初始化,系统将创建新对象时,若用另一个对象来初始化,系统将自动调用自定义拷贝构造函数;若未自定义,则调用缺自动调用自定义拷贝构造函数;若未自定义,则调用缺省拷贝构造函数。省拷贝构造函数。2当类中含有指针成员且需为其动态分配内存,当类中含有指针成员且需为其动态分配内存,一般应自定义拷贝构造函数。一般应自定义拷贝构造函数。第17页,本讲稿共32页e.g.21_3 上例的拷贝构造函数。上例的拷贝构造函数。MyClass:MyClass(MyClass&x)buf=new charstrlen(x.buf)+1;strcpy(buf,x.buf);第18页,本讲稿共32页三、析构函数三、析构

12、函数P220 功能:撤消对象时释放对象占用的功能:撤消对象时释放对象占用的资源。资源。特性:特性:1必须与所属类同名,之前加上必须与所属类同名,之前加上“”号,号,无返回值、无函数类型名也无参数无返回值、无函数类型名也无参数。即析构函数的定义格式为即析构函数的定义格式为:类名()类名()函数体函数体 第19页,本讲稿共32页2撤销对象时,由系统自动调用。撤销对象时,由系统自动调用。若类中未定义析构函数,系统会自动若类中未定义析构函数,系统会自动生成一个隐含的空析构函数:生成一个隐含的空析构函数:称为缺省析构函数。称为缺省析构函数。特性:特性:三、析构函数三、析构函数类名类名()()如果在构造函

13、数中通过如果在构造函数中通过new运算符动态申请了内存空运算符动态申请了内存空间,需自定义析构函数显式地使用间,需自定义析构函数显式地使用delete运算符释放该运算符释放该内存空间。内存空间。第20页,本讲稿共32页class MyClass private:char *buf;public:MyClass(char*inf=NULL);MyClass();MyClass:MyClass(char*inf)/构造函数构造函数 if(!inf)buf=NULL;return;buf=new charstrlen(inf)+1;strcpy(buf,inf);MyClass:MyClass()/

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

15、输入。要求编程计算并输出过道和栅栏的造价。栅栏的造价。游泳池游泳池过道过道第23页,本讲稿共32页#includeusing namespace 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();/圆面积圆面

16、积;第24页,本讲稿共32页 /构造函数初始化数据成员构造函数初始化数据成员radiusCircle:Circle(float r)radius=r;/计算圆的周长计算圆的周长float Circle:Circumference()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对

17、象,表示游泳池对象,表示游泳池Circle PoolCor(radius+3);/游泳池及过道游泳池及过道 /计算栅栏造价并输出计算栅栏造价并输出FenceCost=PoolCor.Circumference()*FencePrice;cout栅栏造价为:栅栏造价为:¥FenceCostendl;/计算过道造价并输出计算过道造价并输出CorridorCost=(PoolCor.Area()-Pool.Area()*CorridorPrice;cout过道造价为:过道造价为:¥CorridorCostendl;第26页,本讲稿共32页四、类的组合四、类的组合类中的数据成员是另一个类对象。类中的数

18、据成员是另一个类对象。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,Point b);/函数的实现略函数的实现略P204第27页,本讲稿共32页四、类的组合四、类的组合 组合类的构造函数组合类的构造函数功能:对基本类型成员和对象成员进行初始化。功能:对基本类型成员和对象

19、成员进行初始化。定义格式:定义格式:类名类名(形参表形参表):对象对象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();void Print();p

20、rivate: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 淘文阁