《第21讲 构造函数和析构函数精选文档.ppt》由会员分享,可在线阅读,更多相关《第21讲 构造函数和析构函数精选文档.ppt(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第21讲 构造函数和析构函数本讲稿第一页,共三十二页第二十一讲第二十一讲第二十一讲第二十一讲 构造函数和析构函数构造函数和析构函数构造函数和析构函数构造函数和析构函数 构造函数构造函数 拷贝构造函数拷贝构造函数 析构函数析构函数 类的组合类的组合本讲稿第二页,共三十二页一、构造函数一、构造函数P211 功能:对成员变量自动进行初始化。功能:对成员变量自动进行初始化。特性:特性:1必须与所属类同名,无返回值也无函数必须与所属类同名,无返回值也无函数类型名,即使是类型名,即使是void也不行。也不行。即构造函数的定义格式为即构造函数的定义格式为:类名(参数表)类名(参数表)函数体函数体 本讲稿第三
2、页,共三十二页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个私有成员个私有成员变量。变量。本讲稿第四页,共三十二页3构造函数必须是公有成员,可在类内或构造函数必须是公有成员,可在类内或类外定义。类外定义。4构造函数可以重载。构造函数可以重载。特性:特性:一、构造函数一、构造函数P214本讲稿第五页,共三十二页一、构造函数一、构造函数class Rect /矩形类矩形类 private:int LeftX,TopY,RightX,BottomY;public:Rect()LeftX=TopY=RightX=BottomY=0;/构造函数构造函数 Rect(int l,int
4、t,int r,int b);/构造函数构造函数 void main()Rect rec1(2,4,6,2),rec2;创建对象创建对象rec2时未给出初始值,时未给出初始值,系统自动调用无参构造函数系统自动调用无参构造函数Rect()(),4个私有成员变量被初个私有成员变量被初始化为始化为0。本讲稿第六页,共三十二页一、构造函数一、构造函数5若类中未定义构造函数,系统会自动生成一若类中未定义构造函数,系统会自动生成一个隐含的空构造函数:个隐含的空构造函数:称为缺省构造函数。称为缺省构造函数。特性:特性:类名类名()()本讲稿第七页,共三十二页e.g.21_1 分析程序运行结果。分析程序运行结
5、果。#includeusing namespace std;int n=0;class MyClass private:int a,b;public:MyClass(int i,int j);/有参构造函数有参构造函数 MyClass();/无参构造函数无参构造函数 void show();本讲稿第八页,共三十二页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()
6、couta=a,b=bshow();ob0=ob1;ob0.show();delete p;创建对象数组时,对每个对象元素自动调用构造函数创建对象数组时,对每个对象元素自动调用构造函数 使用使用new创建动态对象时,自动调用构造函数创建动态对象时,自动调用构造函数 本讲稿第十页,共三十二页一、构造函数一、构造函数类名类名(形参定义表形参定义表):成员变量成员变量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)本讲稿第十一页,共三十二页创建新对象创建新对象A时,若用另一个对象时,若用另一个对象B来来初始化,需使用初始化,需使用拷贝构造函数拷贝构造函数将将B的的值传给值传给A。如:如:Rect rec1(2,4,6,2),rec2(rec1);二、拷贝构造函数二、拷贝构造函数拷贝构造函数是一种特殊的构造函数,拷贝构造函数是一种特殊的构造函数,其其形参为本类对象的引用。用用rec1的值初的值初始化始化rec2本讲稿第十二页,共三十二页 若类中未定义拷贝构造函数,系统会自动若类中未定义拷贝构造函数,系统会自动生成一
8、个隐含的拷贝构造函数:生成一个隐含的拷贝构造函数:1.缺省拷贝构造函数缺省拷贝构造函数类名类名(类名类名&x)*this=x;二、拷贝构造函数二、拷贝构造函数 功能:将对象功能:将对象x赋给被初始化对象。赋给被初始化对象。本讲稿第十三页,共三十二页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 s
9、how();本讲稿第十四页,共三十二页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;本讲稿第十五页,共三十二页void MyClass:show()/显示结果显示结果
10、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();/若执行这两句话,程序运行终止若执行这两句话,程序运行终止本讲稿第十六页,共三十二页二、拷贝构造函数二、拷贝构造函数2.自定义拷贝构造函数自定义拷贝构造函数类名类名(类名类名&参数参数)函数体函数体 说明:
11、说明:1创建新对象时,若用另一个对象来初始化,系统创建新对象时,若用另一个对象来初始化,系统将自动调用自定义拷贝构造函数;若未自定义,则调将自动调用自定义拷贝构造函数;若未自定义,则调用缺省拷贝构造函数。用缺省拷贝构造函数。2当类中含有指针成员且需为其动态分配内存,当类中含有指针成员且需为其动态分配内存,一般应自定义拷贝构造函数。一般应自定义拷贝构造函数。本讲稿第十七页,共三十二页e.g.21_3 上例的拷贝构造函数。上例的拷贝构造函数。MyClass:MyClass(MyClass&x)buf=new charstrlen(x.buf)+1;strcpy(buf,x.buf);本讲稿第十八页
12、,共三十二页三、析构函数三、析构函数P220 功能:撤消对象时释放对象占用的功能:撤消对象时释放对象占用的资源。资源。特性:特性:1必须与所属类同名,之前加上必须与所属类同名,之前加上“”号,无返回值、无函数类型名也无参数号,无返回值、无函数类型名也无参数。即析构函数的定义格式为即析构函数的定义格式为:类名()类名()函数体函数体 本讲稿第十九页,共三十二页2撤销对象时,由系统自动调用。撤销对象时,由系统自动调用。若类中未定义析构函数,系统会自动生若类中未定义析构函数,系统会自动生成一个隐含的空析构函数:成一个隐含的空析构函数:称为缺省析构函数。称为缺省析构函数。特性:特性:三、析构函数三、析
13、构函数类名类名()()如果在构造函数中通过如果在构造函数中通过new运算符动态申请了内存空运算符动态申请了内存空间,需自定义析构函数显式地使用间,需自定义析构函数显式地使用delete运算符释放运算符释放该内存空间。该内存空间。本讲稿第二十页,共三十二页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);
14、MyClass:MyClass()/析构函数析构函数 if(buf)delete buf;本讲稿第二十一页,共三十二页3析构函数必须是公有成员,可在类内或类析构函数必须是公有成员,可在类内或类外定义。外定义。4析构函数不可重载。析构函数不可重载。特性:特性:三、析构函数三、析构函数本讲稿第二十二页,共三十二页e.g.21_4 一圆形游泳池如图所示,现在需在其周一圆形游泳池如图所示,现在需在其周围建一圆形过道,并在其四周围上栅栏。栅栏价围建一圆形过道,并在其四周围上栅栏。栅栏价格为格为35元元/米,过道造价为米,过道造价为20元元/平方米。过道宽平方米。过道宽度为度为3米,游泳池半径由键盘输入。
15、要求编程计算米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。并输出过道和栅栏的造价。游泳池游泳池过道过道本讲稿第二十三页,共三十二页#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();/圆周
16、长圆周长 float Area();/圆面积圆面积;本讲稿第二十四页,共三十二页 /构造函数初始化数据成员构造函数初始化数据成员radiusCircle:Circle(float r)radius=r;/计算圆的周长计算圆的周长float Circle:Circumference()return 2*pi*radius;/计算圆的面积计算圆的面积 float Circle:Area()return pi*radius*radius;本讲稿第二十五页,共三十二页void main()float radius;float FenceCost,CorridorCost;coutradius;Circ
17、le Pool(radius);/创建创建Circle对象,表示游泳池对象,表示游泳池Circle PoolCor(radius+3);/游泳池及过道游泳池及过道 /计算栅栏造价并输出计算栅栏造价并输出FenceCost=PoolCor.Circumference()*FencePrice;cout栅栏造价为:栅栏造价为:¥FenceCostendl;/计算过道造价并输出计算过道造价并输出CorridorCost=(PoolCor.Area()-Pool.Area()*CorridorPrice;cout过道造价为:过道造价为:¥CorridorCostendl;本讲稿第二十六页,共三十二页四
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本讲稿第二十七页,共三十二页四、类的组合四、类的组合 组合类的构造函数组合类的构造函数功能
19、:对基本类型成员和对象成员进行初始化。功能:对基本类型成员和对象成员进行初始化。定义格式:定义格式:类名类名(形参表形参表):对象对象1(形参形参1).,成员变量,成员变量1(形参形参1).包括初始化对象成员和初始化包括初始化对象成员和初始化基本类型成员时所需的形参。基本类型成员时所需的形参。本讲稿第二十八页,共三十二页如:如:class Part /部件类部件类 public:Part();Part(int v);Part();void Print();private:int val;本讲稿第二十九页,共三十二页30class Whole public:Whole();Whole(int i
20、,int j,int k);Whole();void Print();private:Part one;Part two;int date;本讲稿第三十页,共三十二页31Whole:Whole()/无参构造函数无参构造函数 date=0;/有参构造函数有参构造函数Whole:Whole(int i,int j,int k):two(i),one(j),date(k)/其他函数的实现略其他函数的实现略本讲稿第三十一页,共三十二页四、类的组合四、类的组合 组合类构造函数的调用组合类构造函数的调用 构造函数调用顺序:先调用对象成员的构造函数调用顺序:先调用对象成员的构造函数构造函数(按声明顺序,先声明者先构造按声明顺序,先声明者先构造);然后调用本类的构造函数。然后调用本类的构造函数。(析构函数的调用析构函数的调用顺序相反顺序相反)若调用缺省构造函数若调用缺省构造函数(即无参构造函数即无参构造函数),则对象成员的初始化也将调用相应的缺省则对象成员的初始化也将调用相应的缺省构造函数。构造函数。本讲稿第三十二页,共三十二页