您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第10章 构造函数和析构函数
第10章构造函数和析构函数10.1构造函数作用:定义对象时,可以简单地给对象赋初值。10.1.1如何定义构造函数构造函数作为类中的函数出现。构造函数的名字就是类名。可以在函数定义中初始化对象。例:方法一:在类中定义构造函数格式:类名(参数){函数体;}方法二:在类外定义构造函数类名::类名(参数){函数体;}例10-1:定义构造函数#include“string.h”classperson{private:charName[8];ansignedAge:7;unsignedSex:1;public:person(char*name,intage,charsex){strcopy(Name,name);Age=age;Sex=(sex==’m’?0:1);person(){};//函数重载{voidSetname(char*name){strcopy(Name,name);}voidSetage(intage){Age=age;}voidSetsex(charsex){Sex=(sex==’m’?0:1);}voidGetname(char*name)(strcpy(name,Name);)intGetage(){retuenAge;};charGetset(){return(Sex==0?‘m’,’f’);};};例11-2使用构造函数完成数据的输入输出#includeiostream.hclasstime{public:time()//构造函数{hour=0;minute=0;sec=0;}voidset_time();//函数原型voidshow_time();//函数原型private:inthour;intminute;intsec;};voidtime::set_time(){cinhour;cinminute;cinsec;}voidtime::show_time(){couthour;minute:secendl;}main(){timet1;t1.set_time();t1.show_time();timet2;t2.show_time();return0;}程序执行过程:1.定义对象t1,同时自动执行构造函数,对类中的成员赋初值。2.执行t1.set_time()函数,从键盘上给t1对象成员赋值。3.执行t1.show_time()函数,输出t1对象数据成员值。4.定义对象t2,同时自动执行构造函数,对类中的成员赋初值。5.执行t2.show_time()函数,输出t2对象数据成员值。问题:1.如果不给对象成员赋值(第2步不执行),输出结果是什么?2.如果没有构造函数,不给对象成员赋值,输出结果又是什么?3.构造函数如何定义?(类内和类外)time()//在类内进行函数声明time::time()//在类外定义{hour=0;minute=0;sec=0;}4.构造函数如何使用?5.构造函数的名字是什么?6.什么时间调用构造函数?7.构造函数有没有返回值?8.用户不定义构造函数,C++系统会自动生成一个构造函数,该函数是否有内容?9.带参数的构造函数和不带参数的构造函数使用上有什么不同?10.函数重载和构造函数重载的各自作用和不同地方是什么?11.构造函数中的初始值是否一定为0?12.为什么要定义重载构造函数?(定义构造函数之后,不允许使用系统默认构造函数,若要使用必须从新显示说明)10.1.2构造函数与对象初始化格式:对象(实参);或对象;例10-3:利用构造函数对对象初始化且输出#includeiostream.hclassdemo{intx,y;public:demo(inta,intb)//建立构造函数{x=a;y=b;}demo()//构造函数重载{x=10;y=20;}voidprint(){coutx=xendly=yendl;}};voidmain(){demod1(3,4);//定义对象并初始化d1.print();//对象和方法demod2(7,9);//定义对象初始化d2.print();//对象和方法demod3;//定义对象初始化(空)d3.print();}10.1.3构造函数和new运算符new是用来创建动态变量,还可以动态创建对象。例:以下例子是创建对象,其对象是由指针表示#include“102.h”.voidmain(){demo*p1=newDemo(3,5);//定义动态对象指针且对象初始化p1-print();demo*p2=newDemo();p2-print();deletep1;//释放或撤消动态对象deletep2;}说明:定义动态对象可以使用另一种方法:demo*p1;p1=newdemo()或者:demo*p1;p1=newdemo(3,5)释放对象使用delete10.1.4使用默认(缺省)参数的构造函数1.使用默认参数的构造函数的好处2.默认参数的构造函数的定义方法例10-4方法一:#includeiostream.hclasstime{public:time();//显式声明一个无参(默认)的构造函数time(inth,intm,ints):hour(h),minute(m),sec(s){}time(inth,intm):hour(h),minute(m),sec(0){}time(inth):hour(h),minute(0),sec(0){}voidset_time();voidshow_time();private:inthour;intminute;intsec;};time::time()//默认的构造函数{hour=8;intminute=0;intsec=0;}voidtime::set_time(){cinhour;cinminute;cinsec;}voidtime::show_time(){couthour:minute:secendl;}main(){timet1;t1.set_time();t1.show_time();timet2;t2.show_time();timet3(6,6,6);t3.show_time();timet4(6,6);t4.show_time();timet5(6);t5.show_time();return0;}方法二:#includeiostream.hclasstime{public:voidset_time();voidshow_time();time(inth,intm,ints)//定义构造函数{hour=h;minute=m;sec=s;}time()//构造函数定义{hour=8;minute=0;sec=0;}private:inthour;intminute;intsec;};voidtime::set_time(){cinhour;cinminute;cinsec;}voidtime::show_time(){couthour:minute:secendl;}main(){timet1;t1.set_time();t1.show_time();timet2(12,20,0);t2.show_time();timet3;t3.show_time();return0;}说明:1.说明对象时,不给参数,就调用默认构造函数2.用默认构造函数定义对象时,要注意定义方法:timet1;对象名后不能跟()3.定义对象时,根据参数个数调用不同的构造函数4.根据参数个数,还可以定义不同参数个数的构造函数(函数重载):time(inth,intm):hour(h),minute(m);time(inth):hour(h);5.一个类只能有一个默认的构造函数6.注意:time(inth,intm,ints):hour(h),minute(m),sec(s);time(inth,intm):hour(h),minute(m);time(inth):hour(h);构造函数的声明和:time(inth=8,intm=0,ints=0)构造函数的声明的差别前者参数个数固定,是重载构造函数,后者参数个数可变。小结:1.构造函数:带参数的构造函数:解决初始化的灵活性例10-12.带参数的构造函数:解决对象的初始化,,例10-23.构造函数的重载:解决参数个数和类型不同的问题,例10-34.使用默认参数的构造函数;解决初始化时参数个数问题,例10-410.2析构函数用来撤消一个对象的。析构函数的定义:在定义类时:~类名(参数)在定义类外时:类名::类名(参数)例10-5:#includeiostream.hclassDemo{private:intx,y;public:Demo(inta,intb)//建立构造函数{x=a;y=b;}Demo(){}//函数重载~Demo()//析构函数{couthelloendl;}voidPrint(){coutx=xy=yendl;}};Demod(10,20);main(){voidfun();Demod1(3,5);d1.Print();fun();d.Print();//撤消d}voidfun(){Demod2[2]={Demo(1,2),Demo(3,4)};//创建对象数组for(inti=0;i3;i++)d2[i].Print();//撤消d2}输出结果:d//定义对象d1d2[0]d2[1]d2[1]//撤消对象d2[0]d1dx=3y=5x=1y=2x=3y=4x=10y=20说明:析构函数不仅释放对象,还可以执行程序体。释放对象的次序是:先构造的后析构(先用的后释放)。10.3对象的赋值和复制10.3.1对象的赋值#unclude“iosteam”classtime{public:time(inth=8,intm=0,ints=0);voidset_time();voidshow_time();private:inthour;intminute;intsec;};timetime1(10,10,10),time2;time2=time1;10.3.2对象的复制timetime1(10,10,10);timetime2(time1);或者:timetime2=time1;
本文标题:第10章 构造函数和析构函数
链接地址:https://www.777doc.com/doc-3267133 .html