《第章构造函数和析构函数ppt课件》由会员分享,可在线阅读,更多相关《第章构造函数和析构函数ppt课件(32页珍藏版)》请在金锄头文库上搜索。
1、第10章 构造函数和析构函数 10.1 10.1 构造函数构造函数作用:定义对象时,可以简单地给对象赋初值。10.1.1 10.1.1 如何定义构造函数如何定义构造函数构造函数作为类中的函数出现。构造函数的名字就是类名。构造函数的名字就是类名。可以在函数定义中初始化对象。可以在函数定义中初始化对象。例:方法一:在类中定义构造函数格式: ( 参数 ) 方法二:在类外定义构造函数方法二:在类外定义构造函数 :( 参数参数 ) 例10-1:定义构造函数 #include “string.h” class person private : char Name8; ansigned Age : 7; u
2、nsigned Sex : 1; public : person(char *name, int age , char sex) strcopy(Name,name); Age=age; Sex=(sex=m ? 0 : 1 ); person() ; / 函数重载函数重载 void Setname(char *name) strcopy(Name,name); void Setage(int age) Age=age; void Setsex(char sex) Sex=(sex=m ? 0 : 1 ); void Getname(char *name) (strcpy(name, Name
3、); ) int Getage() retuen Age; char Getset() return (Sex=0? m,f); ;例11-2 使用构造函数完成数据的输入输出#include iostream.hclass time public: time( ) /构造函数 hour=0; minute=0; sec=0; void set_time( ); /函数原型 void show_time( ); /函数原型 private: int hour; int minute; int sec; ;void time:set_time( )cinhour; cinminute; cinse
4、c;void time:show_time( )couthour;minute:secendl; main() time t1; t1.set_time( ); t1.show_time( ); time t2; t2.show_time( ); return 0; 程序执行过程:1. 定义对象t1,同时自动执行构造函数,对类中的成员赋初值。2. 执行t1.set_time( )函数,从键盘上给t1对象成员赋值。3. 执行t1.show_time( )函数,输出t1对象数据成员值。4. 定义对象t2,同时自动执行构造函数,对类中的成员赋初值。5.执行t2.show_time( )函数,输出t2
5、对象数据成员值。问题:1. 如果不给对象成员赋值(第2步不执行),输出结果是什么?2. 如果没有构造函数,不给对象成员赋值,输出结果又是什么?3. 构造函数如何定义?(类内和类外) time( ) /在类内进行函数声明 time:time() /在类外定义hour=0; minute=0; sec=0; 4. 构造函数如何使用?5. 构造函数的名字是什么?6. 什么时间调用构造函数?7. 构造函数有没有返回值?8. 用户不定义构造函数,C+系统会自动生成一个构造函数,该函数是否有内容?9. 带参数的构造函数和不带参数的构造函数使用上有什么不同?10. 函数重载和构造函数重载的各自作用和不同地方
6、是什么?11构造函数中的初始值是否一定为0?12为什么要定义重载构造函数?(定义构造函数之后,不允许使用系统默认构造函数,若要使用必须从新显示说明)10.1.2 构造函数与对象初始化构造函数与对象初始化 格式: 对象(实参); 或 对象; 例10-3:利用构造函数对对象初始化且输出 #include iostream.h class demo int x,y; public: demo(int a,int b) /建立构造函数 x=a; y=b; demo() /构造函数重载 x=10; y=20; void print () coutx=xendly=yprint (); demo *p2=
7、new Demo(); p2-print (); delete p1; /释放或撤消动态对象 delete p2; 说明:定义动态对象可以使用另一种方法:demo *p1;p1=new demo( )或者:demo *p1;p1=new demo(3,5 )释放对象使用delete 10.1.4 使用默认(缺省)参数的构造函数使用默认(缺省)参数的构造函数1. 使用默认参数的构造函数的好处2. 默认参数的构造函数的定义方法例10-4方法一:#include iostream.hclass time public: time( ); /显式声明一个无参(默认)的构造函数 time(int h,i
8、nt m,int s):hour(h),minute(m),sec(s) time(int h,int m) : hour(h), minute(m),sec(0) time(int h) : hour(h),minute(0),sec(0)void set_time( );void show_time( );private: int hour; int minute; int sec;time:time( ) /默认的构造函数 hour=8;int minute=0;int sec=0; void time:set_time( ) cinhour;cinminute;cinsec; void
9、 time:show_time( ) couthour:minute:sechour; cinminute; cinsec;void time:show_time( )couthour:minute:secendl;main() time t1; t1.set_time( ); t1.show_time( ); time t2(12,20,0); t2.show_time( ); time t3; t3.show_time(); return 0; 说明:1. 说明对象时,不给参数,就调用默认构造函数2. 用默认构造函数定义对象时,要注意定义方法:time t1; 对象名后不能跟( )3. 定
10、义对象时,根据参数个数调用不同的构造函数4. 根据参数个数,还可以定义不同参数个数的构造函数(函数重载):time(int h,int m) : hour(h), minute(m);time(int h) : hour(h);5一个类只能有一个默认的构造函数6注意:time(int h,int m,int s) : hour(h), minute(m),sec(s); time(int h,int m) : hour(h), minute(m);time(int h) : hour(h);构造函数的声明和:time(int h=8,int m=0,int s=0)构造构造函数的声明的差别函数
11、的声明的差别前者参数个数固定,是重载构造函数,后者参数个数可前者参数个数固定,是重载构造函数,后者参数个数可变。变。小结:小结:1. 构造函数:带参数的构造函数:解决初始化的灵活性构造函数:带参数的构造函数:解决初始化的灵活性例例10-12. 带参数的构造函数:解决对象的初始化,带参数的构造函数:解决对象的初始化, ,例,例10-23. 构造函数的重载:解决参数个数和类型不同的问题,构造函数的重载:解决参数个数和类型不同的问题,例例10-34. 使用默认参数的构造函数;解决初始化时参数个数问使用默认参数的构造函数;解决初始化时参数个数问题,例题,例10-410.2 析构函数析构函数 用来撤消一
12、个对象的。 析构函数的定义: 在定义类时: 类名(参数) 在定义类外时:类名:类名(参数) 例10-5: #include iostream.h class Demo private: int x,y;public:Demo(int a,int b) /建立构造函数 x=a; y=b; Demo() /函数重载 Demo() /析构函数 couthelloendl; void Print() coutx=x y=yendl; ; Demo d(10,20); main() void fun(); Demo d1(3,5); d1.Print(); fun(); d.Print() ; /撤消d
13、 void fun() Demo d22=Demo(1,2),Demo(3,4); /创建对象数组 for(int i=0;i3;i+) d2i.Print(); /撤消d2 输出结果: d /定义对象 d1 d20 d21 d21 /撤消对象 d20 d1dx=3 y=5x=1 y=2x=3 y=4x=10 y=20说明:析构函数不仅释放对象,还可以执行程序体。释放对象的次序是:先构造的后析构(先用的后释放)。10.3 对象的赋值和复制对象的赋值和复制10.3.1 对象的赋值对象的赋值#unclude “iosteam”class time public:time(int h=8,int m=0,int s=0); void set_time( );void show_time( );private: int hour; int minute; int sec; ;time time1(10,10,10), time2;time2=time1;10.3.2 对象的复制对象的复制time time1(10,10,10);time time2(time1);或者:time time2=time1;