《构造函数与析构函数优秀PPT.ppt》由会员分享,可在线阅读,更多相关《构造函数与析构函数优秀PPT.ppt(74页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、构造函数与析构函数1你现在浏览的是第一页,共74页回想一下变量和函数参数的初始化回想一下变量和函数参数的初始化变量变量 定义与赋值结合起来定义与赋值结合起来:int number=9902;int number=9902;函数函数 应用缺省参数应用缺省参数:void add(int a=0,int b=0);void add(int a=0,int b=0);目的目的 便于编程、保证变量的值不会无意义,减小程便于编程、保证变量的值不会无意义,减小程序出错的可能性。序出错的可能性。构造函数和析构函数是类中的特殊的成员函数,构构造函数和析构函数是类中的特殊的成员函数,构造函数造函数,创建并初始化类
2、的数据成员。创建并初始化类的数据成员。析构函数析构函数,对对象撤消时的清理工作象撤消时的清理工作,削除对象,释放内存削除对象,释放内存。2你现在浏览的是第二页,共74页1.1.构造函数的特点:构造函数的特点:v程序中用户程序中用户不能直接调用不能直接调用构造函数,在创建对象时由构造函数,在创建对象时由系统自动调用系统自动调用。v构造函数是构造函数是成员函数成员函数,它可写在类体内(内联函,它可写在类体内(内联函数),也可写在类体外。数),也可写在类体外。v构造函数的函数名与构造函数的函数名与类名相同类名相同,没有返回值,因,没有返回值,因而而不能指定不能指定包括包括voidvoid在内的任何返
3、回值类型在内的任何返回值类型。函数可有。函数可有多参数,也可没有参数,这要根据需要而定。多参数,也可没有参数,这要根据需要而定。v在类中可定义多个构造函数,即构造函数可以在类中可定义多个构造函数,即构造函数可以重载重载。构造函数构造函数3你现在浏览的是第三页,共74页2.2.构造函数应用注意点构造函数应用注意点:v若自己不定义构造函数若自己不定义构造函数,编译程序提供一个缺省构造编译程序提供一个缺省构造函数函数v若程序用到指针若程序用到指针,则应自定义构造函数则应自定义构造函数,以减少以减少程序出错机会程序出错机会.v构造函数和析构函数应成对定义构造函数和析构函数应成对定义,以养成良好的编程习
4、以养成良好的编程习惯惯3.3.构造函数的定义格式为构造函数的定义格式为::类名(类名()函数体函数体 构造函数声明的格式为:构造函数声明的格式为:(););4你现在浏览的是第四页,共74页4.4.构造函数与其他成员函数的区别在于:构造函数与其他成员函数的区别在于:1 1)与类同名)与类同名2 2)没有返回值类型)没有返回值类型3 3)系统创建对象时,自动调用并可用实参对之初)系统创建对象时,自动调用并可用实参对之初始化始化5.5.数据成员初始化数据成员初始化1 1)赋值方式即构造函数可对对象的数据成员进行)赋值方式即构造函数可对对象的数据成员进行初始化初始化classclass X X pri
5、vate:private:int i;int i;public:public:X()X()i=100i=100;5你现在浏览的是第五页,共74页例例:类:类personperson包括包括4 4个数据成员,用来记录人员信息。生成个数据成员,用来记录人员信息。生成对象对象objobj,并使用构造函数为,并使用构造函数为objobj赋予初始值。赋予初始值。#include#include class Person class Person /定义类定义类 private:private:/类类PersonPerson的数据成员的数据成员 char name 10;char name 10;/姓名姓
6、名 int age;int age;/年龄年龄 int salary;int salary;/薪金薪金 char tel8;char tel8;/电话电话public:public:/构造函数构造函数PersonPerson Person Person(char char*xname,*xname,int int xage,int xage,int xsalary,xsalary,char char *xtel*xtel););void disp();void disp();6你现在浏览的是第六页,共74页/函数函数PersonPerson的定义的定义Person Person:Person
7、Person(char char*xname,int*xname,int xage,xage,int int xsalary,char*xtel)xsalary,char*xtel)strcpy(name,xname);strcpy(name,xname);/给各数据成员提供初值给各数据成员提供初值 age=xage;age=xage;salary=xsalary;salary=xsalary;strcpy(tel,xtel);strcpy(tel,xtel);/函数函数dispdisp的定义的定义void Person:disp()void Person:disp()coutendl;cou
8、tendl;cout cout 姓名:姓名:name endl;name endl;cout cout 年龄:年龄:age endl;age endl;cout cout 工资:工资:salary endl;salary endl;cout cout 电话:电话:tel endlendl;tel endlendl;7你现在浏览的是第七页,共74页void main()void main()/主函数主函数 /生成对象生成对象objobj并初始化并初始化Person obj(Person obj(张立三张立三,25,850,45672314);,25,850,45672314);obj.disp(
9、);obj.disp();/显示显示objobj 在主函数中的在主函数中的Person obj(Person obj(张立三张立三,25,850,45672314),25,850,45672314);中完成中完成了以下几个功能:了以下几个功能:1.1.定义并生成了对象定义并生成了对象objobj。2.2.在生成对象在生成对象objobj的同时,的同时,自动调用自动调用相应类的构造函数相应类的构造函数PersonPerson3.3.将初始值将初始值 张立三张立三,25,850,45672314,25,850,45672314传递传递给构造函数给构造函数PersonPerson相应的形参相应的形参
10、xname,xagexname,xage,xsalary,xtelxsalary,xtel。4.4.执行构造函数体,将相应的值执行构造函数体,将相应的值赋给赋给相应的数据成员。相应的数据成员。程序的执行结果是:程序的执行结果是:姓名:张立三姓名:张立三 年龄:年龄:2525 工资:工资:850850 电话:电话:45672314456723148你现在浏览的是第八页,共74页/Exanple:为为类类Person增加构造函数增加构造函数#includeclassPersonprivate:charm_strName20;intm_nAge;intm_nSex;public:Person(con
11、stchar*name,intage,charsex)strcpy(m_strName,name);m_nAge=age;m_nSex=(sex=m?0:1);voidRegister(char*Name,intAge,charSex);voidGetName(char*Name);intGetAge();charGetSex();9你现在浏览的是第九页,共74页说明说明:创创建建对对象象时时,系系统统自自动动调调用用对对象象所所属属类类的的构构造造函函数数;如如果果有有参参数数,则则利利用用实实参参对对对对象象进进行行初初始始化化。当当构构造造函函数数重重载载时时,由由参参数数区区分分调调用
12、用哪哪个个构构造造函函数数例:遇到声明:例:遇到声明:Person person1(Person person1(“Zhang3Zhang3”,19,19,f f););时,编译器就调用构造函数:时,编译器就调用构造函数:Person:person(const char*,int,char);Person:person(const char*,int,char);来创建对象来创建对象person1person1并用实参初始化其数据成员。并用实参初始化其数据成员。如如果果将将构构造造函函数数的的声声明明与与定定义义分分开开,则则声声明明时时不不可可带成员带成员初始化表初始化表10你现在浏览的是第
13、十页,共74页2)2)构造函数的初始化表构造函数的初始化表 构造函数构造函数“头头”与与“体体”之间的初始化值列表之间的初始化值列表类成员声明中不允许赋值类成员声明中不允许赋值常量、引用必须初始化常量、引用必须初始化其他变量也可以类似初始化其他变量也可以类似初始化:():()1),()n)11你现在浏览的是第十一页,共74页类的类的constconst常量常量只能在初始化表里被初始化,因为它只能在初始化表里被初始化,因为它不不能能在函数体内用在函数体内用赋值的方式赋值的方式来初始化来初始化 class A class A const int SIZE=100;const int SIZE=10
14、0;/错误,企图在类声明中初始化错误,企图在类声明中初始化constconst数据成员数据成员 int arraySIZE;int arraySIZE;/错误,未知的错误,未知的SIZESIZE;12你现在浏览的是第十二页,共74页例:例:classclass Sillyclass Sillyclass public:public:Sillyclass()Sillyclass()/此构造函数对成员此构造函数对成员tenten和和refirefi的初始化错误。的初始化错误。ten=10;ten=10;refi=i;refi=i;protected:protected:const int ten;
15、const int ten;/常量数据成员常量数据成员tenten int&refi;int&refi;/引用引用refirefi;说明:说明:1.1.造造成成以以上上错错误误的的原原因因是是在在SillyclassSillyclass类类的的构构造造函函数数进进入入之之后后(开开始始执执行行其其函函数数体体时时),对对象象结结构构已已经经建建立立,数数据据成成员员tenten和和refirefi已已存存在在,而而其其数数据据成成员员tenten为为constconst,而而refirefi为为引引用用,所以在构造函数体内不能再对其指派新的值。所以在构造函数体内不能再对其指派新的值。2.2.解
16、解决决以以上上问问题题的的方方法法是是利利用用初初始始化化表表:在在构构造造函函数数的的括括号号后面加一后面加一“:”和初始化表和初始化表,初始化表的格式是:,初始化表的格式是:数据成员名(值)数据成员名(值),如果有多个时,需要用逗号隔开。,如果有多个时,需要用逗号隔开。13你现在浏览的是第十三页,共74页【例例】类类employee中中包包括括私私有有数数据据成成员员x,和和2个个公公有有函函数数成成员员example、show。程序中使用初始化表是。程序中使用初始化表是x(215)。#include/定义类定义类employeeclassemployeeprivate:constintx
17、;public:employee();voidshow();14你现在浏览的是第十四页,共74页/employee的类外定义的类外定义employee:employee():x(215)/初始化表初始化表/show()的定义。的定义。voidemployee:show()coutnx的值是:的值是:xendl;/主函数主函数voidmain()/生成对象并为生成对象并为x赋予初始值赋予初始值employeeobj;/调用调用show显示显示x的值的值obj.show();15你现在浏览的是第十五页,共74页class class A A A(int size);A(int size);/构造函
18、数构造函数 const int SIZE;const int SIZE;A:A(int size):SIZE(size)A:A(int size):SIZE(size)/构造函数的初始化表构造函数的初始化表 A a(100);A a(100);/对象对象 a a 的的SIZESIZE值为值为100100A b(200);A b(200);/对象对象 b b 的的SIZESIZE值为值为20020016你现在浏览的是第十六页,共74页classclass X X private:private:const int ic;const int ic;int int&ir;&ir;int int i;
19、i;public:public:X():X():ic(100),ic(100),ir(i)ir(i),i (200)i (200)i=300;i=300;17你现在浏览的是第十七页,共74页例例#include iostream.h#include iostream.h classclass date date int year,month,day;int year,month,day;public:public:void setdate(int y,int m,int d)year=y;month=m;day=d;void setdate(int y,int m,int d)year=y;m
20、onth=m;day=d;int isleapyear();int isleapyear();void print();void print();date()year=2000;month=1;day=1;date()year=2000;month=1;day=1;/说明构造函数说明构造函数 date(int y)year=y;month=1;day=1;date(int y)year=y;month=1;day=1;date(int y,int m)year=y;month=m;day=1;date(int y,int m)year=y;month=m;day=1;date(int y,in
21、t n,int d);date(int y,int n,int d);/类定义完类定义完 6.6.构造函数的重载构造函数的重载如果一个类中出现了两个以上的同名的成员函数时,称如果一个类中出现了两个以上的同名的成员函数时,称为为类的成员函数的重载类的成员函数的重载。18你现在浏览的是第十八页,共74页int date:isleapyear()int date:isleapyear()return(year%4=0&year%100!=0)|(year%return(year%4=0&year%100!=0)|(year%400=0);400=0);void date:print()void da
22、te:print()coutyear.month.day endl;coutyear.month.day endl;date:date(int y,int m,int d)date:date(int y,int m,int d)/定义构造函数定义构造函数 year=y;month=m;day=d;year=y;month=m;day=d;19你现在浏览的是第十九页,共74页void main()void main()classclass date d1 date d1,d2(1998);d2(1998);/创建对象并初始化创建对象并初始化 classclass date d3(1999,12)
23、,d4(2000,12,12);d1.print();date d3(1999,12),d4(2000,12,12);d1.print();d2.print();d2.print();d3.print();d3.print();d4.print();d4.print();显示的结果为:显示的结果为:2000.1.1 2000.1.1 1998.1.1 1998.1.1 1999.12.11999.12.12000.12.12 2000.12.12 20你现在浏览的是第二十页,共74页例例:类类RecRec定定义义两两个个重重载载函函数数,其其中中一一个个是是无无参参函函数数,另另一一个个是有参
24、函数。它们都是构造函数。是有参函数。它们都是构造函数。#include#include/定义类定义类classclass Rec Rec private:private:char bookname30;char bookname30;int number;int number;public:public:Rec();Rec();/第第1 1个构造函数说明个构造函数说明 Rec(char*a,int b);Rec(char*a,int b);/第第2 2个构造函数说明个构造函数说明 void show();void show();21你现在浏览的是第二十一页,共74页Rec:Rec()Rec:R
25、ec()/第第1个构造函数定义个构造函数定义 strcpy(bookname,0);strcpy(bookname,0);number=0;number=0;Rec:Rec(char*a,int b)Rec:Rec(char*a,int b)/第第2个构造函数定义个构造函数定义 strcpy(bookname,a);strcpy(bookname,a);number=b;number=b;void Rec:show()void Rec:show()/show的函数定义的函数定义 coutbookname is:booknameendl;coutbookname is:booknameendl;
26、coutbooknumber is:numberendl;coutbooknumber is:numberendl;void main()void main()/主程序主程序 Rec mybook(“Visual C+6.0”,10020);Rec mybook(“Visual C+6.0”,10020);/自动调用构造函数自动调用构造函数Rec(char*a,intb)mybook.show();mybook.show();Rec yourbook;Rec yourbook;/自动调用构造函数自动调用构造函数Rec()yourbook.show();yourbook.show();22你现在
27、浏览的是第二十二页,共74页程序的执行结果是:程序的执行结果是:bookname is:Visual C+6.0bookname is:Visual C+6.0booknumber is:10020booknumber is:10020bookname is:bookname is:no nameno namebooknumber is:0booknumber is:0可可见见,当当出出现现构构造造函函数数重重载载时时,其其匹匹配配方方式式同同普普通通函函数数重重载时的匹配方式。载时的匹配方式。23你现在浏览的是第二十三页,共74页 C+C+规规定定,每每个个类类必必须须有有一一个个构构造造函
28、函数数。如如果果在在类类中中没没有有显显式式定定义义构构造造函函数数时时,则则C+C+编编译译系系统统在在编编译译时时为为该该类类提提供供一个默认的构造函数一个默认的构造函数:();();该该默默认认构构造造函函数数是是个个无无参参函函数数,它它仅仅负负责责创创建建对对象象,而而不做任何初始化工作。不做任何初始化工作。如如果果在在类类声声明明中中已已经经声声明明、定定义义了了构构造造函函数数(不不一一定定是是无无参参构构造造函函数数),C+C+编编译译系系统统就就不不再再提提供供默默认认的的构构造造函函数。数。当当构构造造函函数数有有缺缺省省参参数数时时,称称为为具具有有缺缺省省参参数数的的构
29、构造造函函数数,在使用时要防止二义性。在使用时要防止二义性。7.默认构造函数与缺省构造函数默认构造函数与缺省构造函数24你现在浏览的是第二十四页,共74页但是,一个类类型如果但是,一个类类型如果有有constconst成员或引用成员成员或引用成员,就,就不能不能使用使用缺省的构造函数。必须使用用户定义的构造函数进行缺省的构造函数。必须使用用户定义的构造函数进行初始化;而且只能使用表达式表的方式进行初始化。初始化;而且只能使用表达式表的方式进行初始化。classclass X Xconst int a;const int a;const int&r;const int&r;X Xobj;X Xo
30、bj;/错误错误classclass X X const int a;const int a;const int&r;const int&r;X():a(9),r(a)X():a(9),r(a);X Xobj;X Xobj;/正确正确class class X X const int a;const int a;const int&r;const int&r;X()X()a=9;r=a;a=9;r=a;/错误错误 ;25你现在浏览的是第二十五页,共74页例例classclass Myclass Myclass /定义类定义类Myclass private:private:int member;
31、int member;public:public:Myclass();Myclass();Myclass(int i);Myclass(int i);Myclass:Myclass()Myclass:Myclass()/构造函数构造函数Myclass member=10;member=10;Myclass:Myclass(int i=10)Myclass:Myclass(int i=10)/构造函数构造函数Myclass(inti),该函数的形参该函数的形参i为缺省参数为缺省参数 member=i;member=i;26你现在浏览的是第二十六页,共74页void main()void main
32、()Myclass x(20);Myclass x(20);Myclass y;Myclass y;/产产生生二二义义性性,无无法法确确定定自自动动调调用用哪哪个个构构造造函函数数完完成成对对象象的构造的构造 27你现在浏览的是第二十七页,共74页拷贝构造函数首先是构造函数,拷贝构造函数首先是构造函数,创建对象时被调用创建对象时被调用,其,其功能是将一个已存在的对象的功能是将一个已存在的对象的数据成员数据成员拷贝给正在创建拷贝给正在创建的的另一个同类对象。的的另一个同类对象。具有以下特点:具有以下特点:具有构造函数的所有特性。具有构造函数的所有特性。该函数该函数只有一个参数只有一个参数,并且是
33、对对象的,并且是对对象的引用引用对每个类,编译系统会自动生成一个拷贝构造函数,对每个类,编译系统会自动生成一个拷贝构造函数,作为该类的作为该类的共有成员共有成员。8.8.复制构造函数复制构造函数28你现在浏览的是第二十八页,共74页用户可以自定义一个,其定义格式为:用户可以自定义一个,其定义格式为::(const(const&)其中,参数是一个被其中,参数是一个被constconst修饰的引用,从而修饰的引用,从而说明在函数体中对该引用所引用的对象是不说明在函数体中对该引用所引用的对象是不能修改的能修改的。29你现在浏览的是第二十九页,共74页例:使用缺省拷贝构造函数例:使用缺省拷贝构造函数#
34、include iostream.h class Point int x,y;public:void setpoint(int a,int b)x=a;y=b;int getx()return x;int gety()return y;Point(int a,int b)x=a;y=b;void main()class Point p1(12,12),p2(p1);cout p2.getx()p2.gety()endl;显示结果为:显示结果为:12 1230你现在浏览的是第三十页,共74页例:例:使用自定义拷贝构造函数。使用自定义拷贝构造函数。#include iostream.h#inclu
35、de iostream.h classclass Point Point int x,y;int x,y;public:public:void setpoint(int a,int b)x=a;y=b;void setpoint(int a,int b)x=a;y=b;int getx()return x;int getx()return x;int gety()return y;int gety()return y;Point(int a,int b)x=a;y=b;Point(int a,int b)x=a;y=b;Point(Point&p);Point(Point&p);/说明拷贝构造
36、函数说明拷贝构造函数;Point:Point(Point&p)Point:Point(Point&p)/定义拷贝构造函数定义拷贝构造函数 x=p.x;y=p.y;x=p.x;y=p.y;coutCopy-initialization contructor called!coutCopy-initialization contructor called!endl;endl;31你现在浏览的是第三十一页,共74页void main()void main()class Point p1(12,12),p2(p1);class Point p1(12,12),p2(p1);coutp2.getx()p
37、2.gety()endl;coutp2.getx()p2.gety()endl;程序执行后的显示结果为:程序执行后的显示结果为:Copy-initialization contructor called!Copy-initialization contructor called!12 12 12 12 例例:使用拷贝构造函数。使用拷贝构造函数。#include iostream.h#include iostream.h classclass Point;Point;classclass Point f(Point q);Point f(Point q);classclass Point Poi
38、nt int x,y;int x,y;32你现在浏览的是第三十二页,共74页public:public:void setpoint(int a,int b)x=a;y=b;void setpoint(int a,int b)x=a;y=b;int getx()return x;int getx()return x;int gety()return y;int gety()return y;Point()x=0;y=0;Point()x=0;y=0;Point(int a,int b)x=a;y=b;Point(int a,int b)x=a;y=b;Point(const Point&p);P
39、oint(const Point&p);Point:Point(const Point&p)Point:Point(const Point&p)x=p.x;y=p.y;x=p.x;y=p.y;cout copy-Initializtion completed!n;cout copy-Initializtion completed!n;void main()void main()class Point p1(12,12),p2(p1),p3;class Point p1(12,12),p2(p1),p3;coutp2.getx()p2.gety()endl;coutp2.getx()p2.get
40、y()endl;cout -endl;cout -endl;p3=f(p2);p3=f(p2);33你现在浏览的是第三十三页,共74页coutp3.getx()p3.gety()endl;coutp3.getx()p3.gety()endl;class Point f(class Point q)class Point f(class Point q)int x,y;int x,y;x=q.getx()+10;x=q.getx()+10;y=q.gety()+10;Point r(x,y);y=q.gety()+10;Point r(x,y);return r;return r;程序执行后的显
41、示结果为:程序执行后的显示结果为:copy-Initializtion completed!copy-Initializtion completed!12 12 12 12-copy-Initializtion completed!copy-Initializtion completed!copy-Initializtion completed!copy-Initializtion completed!22 2222 2234你现在浏览的是第三十四页,共74页在上面的程序中,拷贝构造函数被调用了在上面的程序中,拷贝构造函数被调用了3 3次。次。第第一次一次是在是在main()main()函数中
42、执行函数中执行 class Point p2(p1);class Point p2(p1);时;时;第二次第二次是在调用函数是在调用函数f()f()时,实参时,实参p2p2给形参对象给形参对象q q进行初始化时,即实参向形参传递值时;进行初始化时,即实参向形参传递值时;第三次第三次是在是在执行函数执行函数f()f()中的返回语句中的返回语句return r;return r;时,系统用返回时,系统用返回值初始化一匿名的值初始化一匿名的PointPoint对象时使用了拷贝构造函数。对象时使用了拷贝构造函数。在调用在调用f()f()函数返回主函数函数返回主函数main()main()后,用赋值运后
43、,用赋值运算符将算符将匿名对象匿名对象的值赋给对象的值赋给对象p3,p3,然后释放匿名然后释放匿名对象。对象。35你现在浏览的是第三十五页,共74页通过上面的例题分析,在下面三种情况系统通过上面的例题分析,在下面三种情况系统自动调用自动调用拷拷贝构造函数来初始化一个对象:贝构造函数来初始化一个对象:明确表示由一个对象明确表示由一个对象初始化初始化一个对象。例如,上一个对象。例如,上例例main()main()中:中:class Point p1(12,12),class Point p1(12,12),p2(p1)p2(p1),p3;,p3;当对象作为函数当对象作为函数实参实参传递给函数形参时
44、。例如,上传递给函数形参时。例如,上例例main()main()中:中:p3=f(p2);p3=f(p2);当对象作为当对象作为函数的返回值函数的返回值时。例如,上例时。例如,上例main()main()中:中:return r;return r;36你现在浏览的是第三十六页,共74页析构函数析构函数与与构构造造函函数数(创创建建对对象象)相相对对应应的的是是析析构构函函数数(撤撤消消对对象象:当当一一个个对对象象的的生生存存期期结结束束时时,系系统统自动调用析构函数,自动调用析构函数,返还返还它所占据的内存空间)它所占据的内存空间)析构函数定义形式:析构函数定义形式::()();37你现在浏
45、览的是第三十七页,共74页析构函数是成员函数,它可写在类体内,也可写析构函数是成员函数,它可写在类体内,也可写在类体外。在类体外。析析构构函函数数名名与与类类名名相相同同,但但前前面面须须加加 析析构构函函数数不得带任何参数不得带任何参数,不能重载,不能重载一个类定义中只能有一个类定义中只能有一个一个析构函数析构函数析构函数析构函数不返回任何值不返回任何值,用,用voidvoid也不许也不许 析析构构函函数数中中不不能能调调用用C+C+的的库库函函数数exit()exit(),以以防防形形成成无无限限递递归归。但但可可以以调调用用库库函函数数abort()abort(),终终止止整个程序。整个
46、程序。1.析构函数的特点析构函数的特点38你现在浏览的是第三十八页,共74页如果在类的定义中没有显式地定义析构函数,则如果在类的定义中没有显式地定义析构函数,则系统将自动产生一个系统将自动产生一个缺省析构函数缺省析构函数,函数体为空:,函数体为空::()()对对于于一一个个简简单单的的类类来来说说,大大多多可可以以直直接接使使用用系系统统提提供供的的默默认认析析构构函函数数。但但是是,如如果果在在类类的的对对象象中中分分配配有有动动态态内内存存(如如:用用newnew申申请请分分配配的的内内容容)时时,就就必必须须为为该该类类提提供供适适当当的的析析构构函函数数,完完成成清清理工作。理工作。对
47、对象象被被析析构构的的顺顺序序与与对对象象建建立立时时的的顺顺序序正正好好相相反反。即即最后构造的对象先被析构最后构造的对象先被析构。39你现在浏览的是第三十九页,共74页例:当你进入图书馆阅览室借书阅览时,你就成为了例:当你进入图书馆阅览室借书阅览时,你就成为了一个阅览室的阅览人(对象),接什么书是由一进去一个阅览室的阅览人(对象),接什么书是由一进去就完成的(构造)。当你要撤离阅览室(撤消)对象就完成的(构造)。当你要撤离阅览室(撤消)对象时,你必须先归还图书(析构)才能顺当地离开。时,你必须先归还图书(析构)才能顺当地离开。示例构造函数和析构函数的执行次序、构示例构造函数和析构函数的执行
48、次序、构造函数的初始化表造函数的初始化表40你现在浏览的是第四十页,共74页#include#include classclass Ex Ex private:private:int da;int da;char ch;char ch;public:public:Ex(int x,char c=c);Ex(int x,char c=c);Ex()Ex()coutBendl;coutBendl;void outdata(void)void outdata(void)coutchcoutch“,”daendl;daendl;41你现在浏览的是第四十一页,共74页voidmain()Exx(3,a)
49、,y(1);Exz2=Ex(10,a),Ex(1,d);x.outdata();y.outdata();z0.outdata();Ex:Ex(intx,charc):da(x),ch(c)coutAendl;输出结果:输出结果:AAAAa,3c,1a,10BBBB42你现在浏览的是第四十二页,共74页 例例 使用析构造函数。使用析构造函数。#include iostream.h#include iostream.h classclass Point;Point;classclass Point f(Point q);Point f(Point q);classclass Point Point
50、 int x,y;int x,y;public:public:void setpoint(int a,int b)x=a;y=b;void setpoint(int a,int b)x=a;y=b;int getx()return x;int getx()return x;int gety()return y;int gety()return y;Point()x=0;y=0;Point()x=0;y=0;Point(int a,int b)x=a;y=b;Point(int a,int b)x=a;y=b;Point(const Point&p);Point(const Point&p);P