构造函数与析构函数优秀课件.ppt

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

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

1、构造函数与析构函数1第1页,本讲稿共74页回想一下变量和函数参数的初始化变量 定义与赋值结合起来:int number=9902;函数 应用缺省参数:void add(int a=0,int b=0);目的 便于编程、保证变量的值不会无意义,减小程序出错的可能性。构造函数和析构函数是类中的特殊的成员函数,构造函数,创建并初始化类的数据成员。析构函数,对象撤消时的清理工作,削除对象,释放内存。2第2页,本讲稿共74页1.构造函数的特点:v程序中用户不能直接调用构造函数,在创建对象时由系统自动调用。v构造函数是成员函数,它可写在类体内(内联函数),也可写在类体外。v构造函数的函数名与类名相同,没有

2、返回值,因而不能指定包括void在内的任何返回值类型。函数可有多参数,也可没有参数,这要根据需要而定。v在类中可定义多个构造函数,即构造函数可以重载。构造函数构造函数3第3页,本讲稿共74页2.2.构造函数应用注意点构造函数应用注意点:v若自己不定义构造函数若自己不定义构造函数,编译程序提供一个缺省构造函数编译程序提供一个缺省构造函数v若程序用到指针若程序用到指针,则应自定义构造函数则应自定义构造函数,以减少程序出错以减少程序出错机会机会.v构造函数和析构函数应成对定义构造函数和析构函数应成对定义,以养成良好的编程习惯以养成良好的编程习惯3.3.构造函数的定义格式为构造函数的定义格式为::类名

3、(类名()函数体函数体 构造函数声明的格式为:构造函数声明的格式为:(););4第4页,本讲稿共74页4.4.构造函数与其他成员函数的区别在于:构造函数与其他成员函数的区别在于:1 1)与类同名)与类同名2 2)没有返回值类型)没有返回值类型3 3)系统创建对象时,自动调用并可用实参对之初)系统创建对象时,自动调用并可用实参对之初始化始化5.5.数据成员初始化数据成员初始化1 1)赋值方式即构造函数可对对象的数据成员进行)赋值方式即构造函数可对对象的数据成员进行初始化初始化classclass X X private:private:int i;int i;public:public:X()X

4、()i=100i=100;5第5页,本讲稿共74页例:类person包括4个数据成员,用来记录人员信息。生成对象obj,并使用构造函数为obj赋予初始值。#include class Person /定义类 private:/类Person的数据成员 char name 10;/姓名 int age;/年龄 int salary;/薪金 char tel8;/电话public:/构造函数Person Person(char*xname,int xage,int xsalary,char *xtel);void disp();6第6页,本讲稿共74页/函数函数PersonPerson的定义的定义

5、Person Person:Person 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 Pers

6、on:disp()coutendl;coutendl;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第7页,本讲稿共74页void main()void main()/主函数主函数 /生成对象生成对象objobj并初始化并初始化Person obj(Person obj(张立三张立三,25,850,45672314);,25,850,45

7、672314);obj.disp();obj.disp();/显示显示objobj 在主函数中的Person obj(张立三,25,850,45672314);中完成了以下几个功能:1.定义并生成了对象obj。2.在生成对象obj的同时,自动调用相应类的构造函数Person3.将初始值张立三,25,850,45672314传递给构造函数Person相应的形参xname,xage,xsalary,xtel。4.执行构造函数体,将相应的值赋给相应的数据成员。程序的执行结果是:程序的执行结果是:姓名:张立三姓名:张立三 年龄:年龄:2525 工资:工资:850850 电话:电话:4567231445

8、6723148第8页,本讲稿共74页/Exanple:为为类类Person增加构造函数增加构造函数#includeclassPersonprivate:charm_strName20;intm_nAge;intm_nSex;public:Person(constchar*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第9页

9、,本讲稿共74页说明说明:创创建建对对象象时时,系系统统自自动动调调用用对对象象所所属属类类的的构构造造函函数数;如如果果有有参参数数,则则利利用用实实参参对对对对象象进进行行初初始始化化。当当构构造造函函数数重重载载时时,由由参参数数区区分分调调用用哪哪个个构构造造函函数数例:遇到声明:例:遇到声明:Person person1(Person person1(“Zhang3Zhang3”,19,19,f f););时,编译器就调用构造函数:时,编译器就调用构造函数:Person:person(const char*,int,char);Person:person(const char*,in

10、t,char);来创建对象来创建对象person1person1并用实参初始化其数据成员。并用实参初始化其数据成员。如如果果将将构构造造函函数数的的声声明明与与定定义义分分开开,则则声声明明时时不不可可带成员带成员初始化表初始化表10第10页,本讲稿共74页2)2)构造函数的初始化表构造函数的初始化表 构造函数构造函数“头头”与与“体体”之间的初始化值列表之间的初始化值列表类成员声明中不允许赋值类成员声明中不允许赋值常量、引用必须初始化常量、引用必须初始化其他变量也可以类似初始化其他变量也可以类似初始化:():()1),()n)11第11页,本讲稿共74页类的类的constconst常量常量只

11、能在初始化表里被初始化,因为它只能在初始化表里被初始化,因为它不不能能在函数体内用在函数体内用赋值的方式赋值的方式来初始化来初始化 class A class A const int SIZE=100;const int SIZE=100;/错误,企图在类声明中初始化错误,企图在类声明中初始化constconst数据成员数据成员 int arraySIZE;int arraySIZE;/错误,未知的错误,未知的SIZESIZE;12第12页,本讲稿共74页例:例:classclass Sillyclass Sillyclass public:public:Sillyclass()Sillycl

12、ass()/此构造函数对成员此构造函数对成员tenten和和refirefi的初始化错误。的初始化错误。ten=10;ten=10;refi=i;refi=i;protected:protected:const int ten;const int ten;/常量数据成员常量数据成员tenten int&refi;int&refi;/引用引用refirefi;说明:说明:1.1.造造成成以以上上错错误误的的原原因因是是在在SillyclassSillyclass类类的的构构造造函函数数进进入入之之后后(开开始始执执行行其其函函数数体体时时),对对象象结结构构已已经经建建立立,数数据据成成员员te

13、nten和和refirefi已已存存在在,而而其其数数据据成成员员tenten为为constconst,而而refirefi为为引引用用,所以在构造函数体内不能再对其指派新的值。所以在构造函数体内不能再对其指派新的值。2.2.解解决决以以上上问问题题的的方方法法是是利利用用初初始始化化表表:在在构构造造函函数数的的括括号号后面加一后面加一“:”和初始化表和初始化表,初始化表的格式是:,初始化表的格式是:数据成员名(值)数据成员名(值),如果有多个时,需要用逗号隔开。,如果有多个时,需要用逗号隔开。13第13页,本讲稿共74页【例例】类类employee中中包包括括私私有有数数据据成成员员x,和

14、和2个个公公有有函函数数成成员员example、show。程序中使用初始化表是。程序中使用初始化表是x(215)。#include/定义类定义类employeeclassemployeeprivate:constintx;public:employee();voidshow();14第14页,本讲稿共74页/employee的类外定义的类外定义employee:employee():x(215)/初始化表初始化表/show()的定义。的定义。voidemployee:show()coutnx的值是:的值是:xendl;/主函数主函数voidmain()/生成对象并为生成对象并为x赋予初始值赋予

15、初始值employeeobj;/调用调用show显示显示x的值的值obj.show();15第15页,本讲稿共74页class class A A A(int size);A(int size);/构造函数构造函数 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值为值为2002

16、0016第16页,本讲稿共74页class Xprivate:const int ic;int&ir;int i;public:X():ic(100),ir(i),i (200)i=300;17第17页,本讲稿共74页例#include iostream.h class date int year,month,day;public:void setdate(int y,int m,int d)year=y;month=m;day=d;int isleapyear();void print();date()year=2000;month=1;day=1;/说明构造函数 date(int y)ye

17、ar=y;month=1;day=1;date(int y,int m)year=y;month=m;day=1;date(int y,int n,int d);/类定义完 6.构造函数的重载如果一个类中出现了两个以上的同名的成员函数时,称为类的成员函数的重载。18第18页,本讲稿共74页int date:isleapyear()return(year%4=0&year%100!=0)|(year%400=0);void date:print()coutyear.month.day endl;date:date(int y,int m,int d)/定义构造函数 year=y;month=m;

18、day=d;19第19页,本讲稿共74页void main()class date d1,d2(1998);/创建对象并初始化 class date d3(1999,12),d4(2000,12,12);d1.print();d2.print();d3.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第20页,本讲稿共74页例例:类类RecRec定定义义两两个个重重载载函函数数,其其中中一一个个是是无无参参函函数数,另另一

19、一个个是有参函数。它们都是构造函数。是有参函数。它们都是构造函数。#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第21页,本讲稿共74页Rec:Rec()Rec:

20、Rec()/第第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

21、;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第2

22、2页,本讲稿共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第23页,本讲稿共74页 C+C+规规定定,每每个个类类必必须须有有一一个个构构造造函函数数。如如果果在

23、在类类中中没没有有显显式式定定义义构构造造函函数数时时,则则C+C+编编译译系系统统在在编编译译时时为为该该类类提提供供一个默认的构造函数一个默认的构造函数:();();该该默默认认构构造造函函数数是是个个无无参参函函数数,它它仅仅负负责责创创建建对对象象,而而不做任何初始化工作。不做任何初始化工作。如如果果在在类类声声明明中中已已经经声声明明、定定义义了了构构造造函函数数(不不一一定定是是无无参构造函数),参构造函数),C+C+编译系统就不再提供默认的构造函数。编译系统就不再提供默认的构造函数。当当构构造造函函数数有有缺缺省省参参数数时时,称称为为具具有有缺缺省省参参数数的的构构造造函函数数

24、,在使用时要防止二义性。在使用时要防止二义性。7.默认构造函数与缺省构造函数24第24页,本讲稿共74页但是,一个类类型如果有const成员或引用成员,就不能使用缺省的构造函数。必须使用用户定义的构造函数进行初始化;而且只能使用表达式表的方式进行初始化。class Xconst int a;const int&r;X Xobj;/错误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 i

25、nt a;const int a;const int&r;const int&r;X()X()a=9;r=a;a=9;r=a;/错误错误 ;25第25页,本讲稿共74页例例classclass Myclass Myclass /定义类定义类Myclass private:private:int member;int member;public:public:Myclass();Myclass();Myclass(int i);Myclass(int i);Myclass:Myclass()Myclass:Myclass()/构造函数构造函数Myclass member=10;member=10

26、;Myclass:Myclass(int i=10)Myclass:Myclass(int i=10)/构造函数构造函数Myclass(inti),该函数的形参该函数的形参i为缺省参数为缺省参数 member=i;member=i;26第26页,本讲稿共74页void main()void main()Myclass x(20);Myclass x(20);Myclass y;Myclass y;/产产生生二二义义性性,无无法法确确定定自自动动调调用用哪哪个个构构造造函函数数完完成成对对象象的构造的构造 27第27页,本讲稿共74页拷贝构造函数首先是构造函数,创建对象时被调用,其功能是将一个已

27、存在的对象的数据成员拷贝给正在创建的的另一个同类对象。具有以下特点:具有构造函数的所有特性。该函数只有一个参数,并且是对对象的引用对每个类,编译系统会自动生成一个拷贝构造函数,作为该类的共有成员。8.复制构造函数28第28页,本讲稿共74页用户可以自定义一个,其定义格式为::(const&)其中,参数是一个被const修饰的引用,从而说明在函数体中对该引用所引用的对象是不能修改的。29第29页,本讲稿共74页例:使用缺省拷贝构造函数#include iostream.h class Point int x,y;public:void setpoint(int a,int b)x=a;y=b;i

28、nt 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第30页,本讲稿共74页例:使用自定义拷贝构造函数。#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

29、(int a,int b)x=a;y=b;Point(Point&p);/说明拷贝构造函数;Point:Point(Point&p)/定义拷贝构造函数 x=p.x;y=p.y;coutCopy-initialization contructor called!endl;31第31页,本讲稿共74页void main()class Point p1(12,12),p2(p1);coutp2.getx()p2.gety()endl;程序执行后的显示结果为:Copy-initialization contructor called!12 12 例:使用拷贝构造函数。#include iostream

30、.h class Point;class Point f(Point q);class Point int x,y;32第32页,本讲稿共74页public:void setpoint(int a,int b)x=a;y=b;int getx()return x;int gety()return y;Point()x=0;y=0;Point(int a,int b)x=a;y=b;Point(const Point&p);Point:Point(const Point&p)x=p.x;y=p.y;cout copy-Initializtion completed!n;void main()cl

31、ass Point p1(12,12),p2(p1),p3;coutp2.getx()p2.gety()endl;cout -endl;p3=f(p2);33第33页,本讲稿共74页coutp3.getx()p3.gety()endl;class Point f(class Point q)int x,y;x=q.getx()+10;y=q.gety()+10;Point r(x,y);return r;程序执行后的显示结果为:copy-Initializtion completed!12 12-copy-Initializtion completed!copy-Initializtion c

32、ompleted!22 2234第34页,本讲稿共74页在上面的程序中,拷贝构造函数被调用了3次。第一次是在main()函数中执行 class Point p2(p1);时;第二次是在调用函数f()时,实参p2给形参对象q进行初始化时,即实参向形参传递值时;第三次是在执行函数f()中的返回语句return r;时,系统用返回值初始化一匿名的Point对象时使用了拷贝构造函数。在调用f()函数返回主函数main()后,用赋值运算符将匿名对象的值赋给对象p3,然后释放匿名对象。35第35页,本讲稿共74页通过上面的例题分析,在下面三种情况系统通过上面的例题分析,在下面三种情况系统自动调用自动调用拷

33、贝拷贝构造函数来初始化一个对象:构造函数来初始化一个对象:明确表示由一个对象明确表示由一个对象初始化初始化一个对象。例如,上例一个对象。例如,上例mainmain()()中:中:class Point p1(12,12),class Point p1(12,12),p2(p1)p2(p1),p3;,p3;当对象作为函数当对象作为函数实参实参传递给函数形参时。例如,上例传递给函数形参时。例如,上例mainmain()()中:中:p3=f(p2);p3=f(p2);当对象作为当对象作为函数的返回值函数的返回值时。例如,上例时。例如,上例main()main()中:中:return r;return

34、 r;36第36页,本讲稿共74页析构函数析构函数与与构构造造函函数数(创创建建对对象象)相相对对应应的的是是析析构构函函数数(撤撤消消对对象象:当当一一个个对对象象的的生生存存期期结结束束时时,系系统统自动调用析构函数,自动调用析构函数,返还返还它所占据的内存空间)它所占据的内存空间)析构函数定义形式:析构函数定义形式::()();37第37页,本讲稿共74页析构函数是成员函数,它可写在类体内,也可写析构函数是成员函数,它可写在类体内,也可写在类体外。在类体外。析析构构函函数数名名与与类类名名相相同同,但但前前面面须须加加 析析构构函函数数不得带任何参数不得带任何参数,不能重载,不能重载一个

35、类定义中只能有一个类定义中只能有一个一个析构函数析构函数析构函数析构函数不返回任何值不返回任何值,用,用voidvoid也不许也不许 析析构构函函数数中中不不能能调调用用C+C+的的库库函函数数exit()exit(),以以防防形形成成无无限限递递归归。但但可可以以调调用用库库函函数数abort()abort(),终终止止整个程序。整个程序。1.析构函数的特点38第38页,本讲稿共74页如果在类的定义中没有显式地定义析构函数,则如果在类的定义中没有显式地定义析构函数,则系统将自动产生一个系统将自动产生一个缺省析构函数缺省析构函数,函数体为空:,函数体为空::()()对对于于一一个个简简单单的的

36、类类来来说说,大大多多可可以以直直接接使使用用系系统统提提供供的的默默认认析析构构函函数数。但但是是,如如果果在在类类的的对对象象中中分分配配有有动动态态内内存存(如如:用用newnew申申请请分分配配的的内内容容)时时,就就必必须须为为该该类类提提供供适适当当的的析析构构函函数数,完完成成清清理工作。理工作。对对象象被被析析构构的的顺顺序序与与对对象象建建立立时时的的顺顺序序正正好好相相反反。即即最后构造的对象先被析构最后构造的对象先被析构。39第39页,本讲稿共74页例:当你进入图书馆阅览室借书阅览时,你就成为了一个阅览室的阅览人(对象),接什么书是由一进去就完成的(构造)。当你要撤离阅览

37、室(撤消)对象时,你必须先归还图书(析构)才能顺当地离开。示例构造函数和析构函数的执行次序、构造函数的初始化表40第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第41页

38、,本讲稿共74页void main()Ex x(3,a),y(1);Ex z2=Ex(10,a),Ex(1,d);x.outdata();y.outdata();z0.outdata();Ex:Ex(int x,char c):da(x),ch(c)coutAendl;输出结果:输出结果:AAAAa,3c,1a,10BBBB42第42页,本讲稿共74页例 使用析构造函数。#include iostream.h class Point;class Point f(Point q);class Point int x,y;public:void setpoint(int a,int b)x=a;y

39、=b;int getx()return x;int gety()return y;Point()x=0;y=0;Point(int a,int b)x=a;y=b;Point(const Point&p);Point()cout Destructor called!n;43第43页,本讲稿共74页Point:Point(const Point&p)x=p.x;y=p.y;cout copy-Initializtion completed!n;void main()class Point p1(12,12),p2(p1),p3;coutp2.getx()p2.gety()endl;cout -e

40、ndl;p3=f(p2);cout p3.getx()p3.gety()endl;class Point f(class Point q)int x,y;x=q.getx()+10;y=q.gety()+10;Point r(x,y);return r;44第44页,本讲稿共74页程序执行后的显示结果为:copy-Initializtion completed!12 12-copy-Initializtion completed!copy-Initializtion completed!Destructor called!Destructor called!Destructor called!

41、22 22 Destructor called!Destructor called!Destructor called!45第45页,本讲稿共74页在上例中,退出函数f()时,函数中定义的两个对象q、r被释放,系统自动调用析构函数2次。在main()函数中,用赋值运算符将匿名对象赋给对象p3后,系统释放匿名对象,此时又调用一次析构函数,共调用 了3次析构函数。最后,退出整个程序时,系统释放p1、p2和p3三个对象,又3次调用析构函数。46第46页,本讲稿共74页【例】【例】类类TeacherTeacher的构造函数为的构造函数为namename申请存储空间,在析构函数中释放该空间。申请存储空间

42、,在析构函数中释放该空间。#include#include#include#include /定义类定义类classclass Teacher Teacher private:private:char*name;char*name;int age;int age;public:public:/说明构造函数说明构造函数Teacher Teacher(char*i,int a)Teacher(char*i,int a)name=new charstrlen(i)+1;name=new charstrlen(i)+1;/用用new为为name成员分配堆内存成员分配堆内存 strcpy(name,i)

43、;strcpy(name,i);age=a;age=a;coutn coutn 执行构造函数执行构造函数Teacher endl;Teacher endl;47第47页,本讲稿共74页/说明析构函数说明析构函数Teacher Teacher()Teacher()delete name;delete name;coutcout执行析构函数执行析构函数Teacher endlendl;Teacher endlendl;void show();void show();void Teacher:show()void Teacher:show()cout cout 姓名:姓名:name name 年龄:

44、年龄:age endl;age endl;void main()void main()/主程序主程序 Teacher obj(Teacher obj(张立三张立三,25);,25);obj.show();obj.show();程序的执行结果是:程序的执行结果是:执行构造函数执行构造函数TeacherTeacher姓名:张立三姓名:张立三 年龄:年龄:25 25执行析构函数执行析构函数TeacherTeacher48第48页,本讲稿共74页一个对象可以用作另一个对象的成员一个对象可以用作另一个对象的成员一个对象可以用作另一个对象的成员一个对象可以用作另一个对象的成员当当一一个个类类的的成成员员是

45、是某某一一个个类类的的对对象象时时,该该对对象象就就称称为为子子对对象象,子对象实际上是对象成员。,子对象实际上是对象成员。在在C+C+中中,当当把把一一个个类类的的对对象象作作为为新新类类的的数数据据员员时时,则则新类的定义格式可表示为:新类的定义格式可表示为:classclass X X 类名类名1 1 成员名成员名1;1;类名类名2 2 成员名成员名2;2;类名类名n n 成员名成员名n;n;/其它成员其它成员;49第49页,本讲稿共74页如如果果一一个个类类A A的的对对象象作作为为另另一一个个类类B B的的数数据据成成员员,则则在在类类B B的的对对象象创创建建过过程程中中,调调用用

46、其其构构造造函函数数的的过过程程中中,数数据据成成员员(类类A A的对象)会的对象)会自动调用自动调用类类A A的构造函数。的构造函数。但但应应注注意意:如如果果类类A A的的构构造造函函数数为为有有参参函函数数时时,则则在在程程序序中中必必须须在在类类B B的的构构造造函函数数的的括括号号后后面面加加一一“:”和和被被调调用用的的类类A A的的构构造造函函数数,且且调调用用类类A A的的构构造造函函数数时时的的实实参参值值必必须须来来自自类类B B的的形形参参表表中中的的形形参参。这这种种方方法法称称为为初初始始化化表表的的方方式式调调用用构构造造函函数数。如如:以以上上面面定定义义的的类类

47、X X为为例例,在在对对类类X X的的对对象象进进行行初初始始化化时时,必必须须首首先先初初始始化化其其中中的的子子对对象象,即即必必须须首首先先调调用用这这些些子对象的构造函数。因此,类子对象的构造函数。因此,类X X的构造函数的定义格式应为:的构造函数的定义格式应为:X X:X X(参参数数表表0 0):成成员员1 1(参参数数表表1 1),成成员员2 2(参参数数表表2 2),),成员,成员n(n(参数表参数表n)n)50第50页,本讲稿共74页其其中中,参参数数表表1 1提提供供初初始始化化成成员员1 1所所需需的的参参数数,参参数数表表2 2提提供供初初始始化化成成员员2 2所所需需

48、的的参参数数,依依此此类类推推。并并且且这这几几个个参参数数表表的的中中的的参参数数均均来来自自参参数数表表0 0,另另外外,初初始化始化X X的的非对象成员非对象成员所需的参数,也由参数表所需的参数,也由参数表0 0提供。提供。在在构构造造新新类类的的对对象象过过程程中中,系系统统首首先先调调用用其其子子对对象象的的构构造造函函数数,初初始始化化子子对对象象;然然后后才才执执行行类类X X自自己己的的构构造造函函数数,初初始始化化类类中中的的非非对对象象成成员员。对对于于同同一一类类中中的的不不同同子子对对象象,系系统统按按照照它它们们在在类类中中的的说说明明顺顺序序调调用用相相应应的的构构

49、造造函函数数进进行行初初始始化化,而而不不是是按按照照初初始始化化表表的顺序的顺序。51第51页,本讲稿共74页【例例】以以下下定定义义了了三三个个StudentStudent、TeacherTeacher和和TourpairTourpair,其其中中StudentStudent类类的的对对象象和和TeacherTeacher类类的的对对象象作作为为了了TourpairTourpair的的数据成员,观察对象的构造过程和构造函数被执行的顺序。数据成员,观察对象的构造过程和构造函数被执行的顺序。#includeclassStudentpublic:Student()cout”constructst

50、udent.n”;semeshours=100;gpa=3.5;protected:intsemeshours;floatgpa;52第52页,本讲稿共74页classTeacherpublic:Teacher()cout”constructTeacher.n”;classTourpairpublic:Tourpair()cout”constructtourpair.n”;nomeeting=0;protected:Studentstudent;Teacherteacher;intnomeeting;53第53页,本讲稿共74页voidmain()Tourpairtp;cout”backinm

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

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

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

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