第3讲构造函数和析构函数

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

3.1构造函数3.1.1对象的初始化类的数据成员不是在说明类时初始化的classTime{inthour=0;intminute=0;intsec=0;};//错3.1.1对象的初始化类的所有成员都是公用的,可在定义对象时对数据成员进行初始化classTime{public:inthour;intminute;intsec;};Timet1={14,56,30};构造函数和析构函数类的特殊的成员函数系统自动调用执行名字与类的名字有关3.1.2构造函数的作用用于创建对象时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。当创建对象时,系统自动调用函数名与类名相同可重载、可为内联函数、可带缺省形参不能具有返回类型#includeiostreamusingnamespacestd;classTime{public:Time();//构造函数voidset_time();voidshow_time();private:inthour;intminute;intsec;};3.1.2构造函数的作用voidTime::Time(){hour=0;minute=0;sec=0;}voidTime::set_time(){cinhour;cinminute;cinsec;}voidTime::show_time(){couthour:minute:secendl;}3.1.2构造函数的作用intmain(){Timet1;//系统自动调用构造函数t1.show_time();Timet2;//系统自动调用构造函数t2.show_time();return0;}3.1.2构造函数的作用注意事项对象进入其作用域时调用构造函数函数无返回值voidTime(){}//错误不能显式调用t1.Time();//错,不可显示调用可以包括其它语句如果用户没定义任何构造函数,系统提供一个默认构造函数3.1.3带参数的构造函数构造函数首部一般格式构造函数名(类型1形参1,类型2形参2,…)定义对象的一般格式类名对象名(实参1,实参2,…);3.1.3带参数的构造函数例3.2有两个长方形,其长、宽、高分别为:(1)12,25,30;(2)15,30,21。分别求它们的体积。编写一个程序,在类中用带参数的构造函数。#includeiostreamusingnamespacestd;classBox{public:Box(int,int,int);//声明带参数的构造函数intvolume();//声明计算体积的函数private:intheight;intwidth;intlength;};3.1.3带参数的构造函数Box::Box(inth,intw,intlen)//类外定义带参数的构造函数{height=h;width=w;length=len;}intBox::volume()//类外定义计算体积的函数{return(height*width*length);}intmain(){Boxbox1(12,25,30);//建立对象box1,并指定其长、宽、高coutThevolumeofbox1isbox1.volume()endl;Boxbox2(15,30,21);//建立对象box2,并指定其长、宽、高coutThevolumeofbox2isbox2.volume()endl;return0;}3.1.3带参数的构造函数带参数的构造函数中的形参,其对应的实参在定义对象时给定可方便的实现对不同对象的初始化3.1.4带参数初始化表对数据成员初始化不在函数体内,在函数首部对数据初始化Box:Box(inth,intw,intlen):height(t),width(w),length(len){}3.1.5重载构造函数一个类中可以定义多个构造函数,以便对类对象提供不同的初始化方法。构造函数具有相同的名字,而参数的格式或类型不相同。参见1.3.41.3.4函数的重载C++允许在同一作用域中用同一函数名定义多个函数,这些函数的参数个数和参数类型不相同,这些同名的函数用来实现不同的功能。函数的重载,即一个函数名多用。1.3.4函数的重载#includeiostream//参数类型不同usingnamespacestd;intmax(inta,intb,intc)//求3个整数中的最大者{if(ba)a=b;if(ca)a=c;returna;}floatmax(floata,floatb,floatc)//求3个实数中的最大者{if(ba)a=b;if(ca)a=c;returna;}longmax(longa,longb,longc)//求3个长整数中的最大者{if(ba)a=b;if(ca)a=c;returna;}1.3.4函数的重载intmain(){inta,b,c;floatd,e,f;longg,h,i;cinabc;cindef;cinghi;intm;m=max(a,b,c);//函数值为整型coutmax_i=mendl;floatn;n=max(d,e,f);//函数值为实型coutmax_f=nendl;longintp;p=max(g,h,i);//函数值为长整型coutmax_l=pendl;return0;}#includeiostreamusingnamespacestd;intmax(inta,intb,intc)//求3个整数中的最大者{if(ba)a=b;if(ca)a=c;returna;}intmax(inta,intb)//求两个整数中的最大者{if(ab)returna;elsereturnb;}1.3.4函数的重载intmain(){inta=7,b=-4,c=9;coutmax(a,b,c)endl;//输出3个整数中的最大者coutmax(a,b)endl;//输出两个整数中的最大者return0;}1.3.4函数的重载3.1.5重载构造函数可以像普通函数一样被重载,C++根据说明中的参数个数和类型选择合适的构造函数。若类X具有一个或多个构造函数,创建类X的对象时,C++会根据参数选择调用其中一个。#includeiostreamusingnamespacestd;classBox{public:Box();Box(inth,intw,intlen):height(h),width(w),length(len){}intvolume();private:intheight;intwidth;intlength;};3.1.5重载构造函数Box::Box(){height=10;width=10;length=10;}intBox::volume(){return(height*width*length);}intmain(){Boxbox1;//建立对象box1,不指定实参coutThevolumeofbox1isbox1.volume()endl;Boxbox2(15,30,25);//建立对象box2,指定3个实参coutThevolumeofbox2isbox2.volume()endl;return0;}3.1.5重载构造函数还可以定义其他重载构造函数Box::Box(inth);Box::Box(inth,intw);3.1.5重载构造函数默认构造函数(缺省构造函数):在调用构造函数时不必给出实参的构造函数;无参的构造函数属于默认构造函数;一个类只能有一个默认构造函数;如果用户未定义构造函数,系统自动提供一个什么都不做的默认构造函数。3.1.5重载构造函数定义对象时,选用无参构造函数的书写格式:Boxbox1;//定义类Box的对象Box1Boxbox1();//声明一个普通函数box1,其返回值为Box类型对每个对象来说,建立对象时只执行其中一个构造函数。3.1.5重载构造函数有默认参数的函数(参见1.3.6)3.1.6使用默认参数的构造函数通常调用函数时,形参从实参取得值;给形参一个默认值,形参不必一定从实参取值。floatarea(floatr=6.5);area();//相当于area(6.5)area(7.5);1.3.6有默认参数的函数如果有多个形参,可以使每个形参有一个默认值,也可以只对一部分形参指定默认值,另一部分形参不指定默认值。floatvolume(floath,floatr=12.5);函数调用可以采用如下形式:volume(45.6);//相当于volume(45.6,12.5)volume(34.2,10.4);1.3.6有默认参数的函数指定默认值的参数必须放在形参表列中的最右端。voidf1(floata,intb=0,intc,chard=‘a’);//错voidf2(floata,intc,intb=0,chard=‘a’);//对调用形式:f2(3.5,5,3,‘x’);f2(3.5,5,3);f2(3.5,5);1.3.6有默认参数的函数#includeiostream//例3.4usingnamespacestd;classBox{public:Box(intw=10,inth=10,intlen=10);intvolume();private:intheight;intwidth;intlength;};Box::Box(intw,inth,intlen){height=h;width=w;length=len;}3.1.6使用默认参数的构造函数intBox::volume(){return(height*width*length);}intmain(){Boxbox1;//各形参使用默认值coutThevolumeofbox1isbox1.volume()endl;Boxbox2(15);//w,len取默认值10coutThevolumeofbox2isbox2.volume()endl;Boxbox3(15,30);//len取默认值10coutThevolumeofbox3isbox3.volume()endl;Boxbox4(15,30,20);coutThevolumeofbox4isbox4.volume()endl;return0;}3.1.6使用默认参数的构造函数声明构造函数时指定默认值;声明构造函数时,形参名可以省略;如果构造函数的全部参数都指定了默认值,定义对象时可以给一个或几个实参,也可以不给出实参;全部参数都指定了默认值的构造函数也属于默认构造函数Box();Box(int=10,int=10,int=10);一个类只能有一个默认构造函数3.1.6使用默认参数的构造函数在定义了全部默认参数的构造函数后,不能再定义重载构造函数;Box(int=10,int=10,int=10);Box();Box(int,int);Boxbox1;//调用第一or第二个构造函数?Boxbox2(15,30);//调用第一or第三?3.1.6使用默认参数的构造函数如果构造函数中的参数并非全部为默认值时,要分析具体情况;Box();Box(int,int=10,int=10);Box(int,int);Boxbox1;//调用第一个构造函数?Boxbox2(15);//调用第二个构造函数?Boxbox3(15,30);//错误,歧义一般不应同时使用构造函数重载和有默认参数的构造函数3.1.6使用默认参数的构造函数

1 / 35
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功