构造函数与析构函数.ppt
《构造函数与析构函数.ppt》由会员分享,可在线阅读,更多相关《构造函数与析构函数.ppt(64页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2023/4/17第第11章章 构造函数与析构函数构造函数与析构函数教学主要内容教学主要内容类的构造函数类的构造函数析构函数析构函数静态成员静态成员友元友元重点与难点重点与难点类与构造函数类与构造函数友元友元12023/4/17第第11章章 构造函数与析构函数构造函数与析构函数教学目标教学目标(1)熟练掌握使用构造函数在创建对象时)熟练掌握使用构造函数在创建对象时对其进行初始化对其进行初始化(2)掌握使用析构函数在释放对象时清理)掌握使用析构函数在释放对象时清理现场现场(3)会使用友元访问类中的成员)会使用友元访问类中的成员22023/4/17第第11章章 构造函数与析构函数构造函数与析构函数
2、11.1 构造函数与析构函数概述构造函数与析构函数概述11.2 拷贝构造函数拷贝构造函数11.3 对象数组对象数组11.4 this指针指针11.5 静态成员静态成员11.6 友元友元32023/4/1711.1.1 构造函数构造函数当建立一个对象时,对象的状态(数据当建立一个对象时,对象的状态(数据成员的取值)是不确定的。常常需要初始化。成员的取值)是不确定的。常常需要初始化。C+中有一个称为构造函数的特殊成员函数,中有一个称为构造函数的特殊成员函数,可自动进行对象的初始化。相对于构造函数,可自动进行对象的初始化。相对于构造函数,一个称为析构函数的成员函数在对象撤消时自一个称为析构函数的成员
3、函数在对象撤消时自动执行清理任务。动执行清理任务。11.1 构造函数和析构函数构造函数和析构函数42023/4/17构造函数构造函数构造函数是一种特殊的成员函数,它的作用是在对构造函数是一种特殊的成员函数,它的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态,给各成员数据赋初值。构造函数在对为一个特定的状态,给各成员数据赋初值。构造函数在对象创建时由系统自动调用。象创建时由系统自动调用。构造函数除具有一般成员函数的特性之外,还具有构造函数除具有一般成员函数的特性之外,还具有一些特殊的性质:一些特殊的性质:(1)构造函
4、数的名字必须与类名相同。)构造函数的名字必须与类名相同。(2)构造函数可以有任意类型的参数,但不能指定返回类)构造函数可以有任意类型的参数,但不能指定返回类型。它有隐含的返回值,该值由系统内部使用。型。它有隐含的返回值,该值由系统内部使用。(3)构造函数允许为内联函数、重载函数、带缺省形参值)构造函数允许为内联函数、重载函数、带缺省形参值的函数。的函数。(4)构造函数被声明为公有函数,但它不能像其他成员函)构造函数被声明为公有函数,但它不能像其他成员函数那样被显式地调用,它是在定义对象的同时被系统调用数那样被显式地调用,它是在定义对象的同时被系统调用的。的。52023/4/17构造函数的定义构
5、造函数的定义在类定义时没有定义任何构造函数时,编译在类定义时没有定义任何构造函数时,编译器会自动为这个类生成一个不带参数的缺省构造函器会自动为这个类生成一个不带参数的缺省构造函数,其格式如下:数,其格式如下::()在程序中定义一个对象而没有进行初始化时,在程序中定义一个对象而没有进行初始化时,则编译器便按缺省构造函数来初始化该对象。只是则编译器便按缺省构造函数来初始化该对象。只是这个构造函数的函数体是空的,也没有参数,不执这个构造函数的函数体是空的,也没有参数,不执行初始化操作。行初始化操作。62023/4/17构造函数的应用示例构造函数的应用示例【实例实例11-1-1】定义一个时钟类(包括:
6、时、分、秒)及该定义一个时钟类(包括:时、分、秒)及该类的对象,分别使用普通成员函数和构造函数初始化数据类的对象,分别使用普通成员函数和构造函数初始化数据成员。成员。72023/4/17构造函数的应用示例构造函数的应用示例#include using namespace std;class Timepublic:Time()/定义构造成员函数,函数名与类名相同定义构造成员函数,函数名与类名相同hour=0;/利用构造函数对对象中的数据成员赋初值利用构造函数对对象中的数据成员赋初值minute=0;sec=0;void set_time();/函数声明函数声明void show_time();/
7、函数声明函数声明private:int hour;/私有数据成员私有数据成员int minute;int sec;82023/4/17构造函数的应用示例构造函数的应用示例void Time:set_time()/定义成员函数,向数据成员赋值定义成员函数,向数据成员赋值cinhour;cinminute;cinsec;void Time:show_time()/定义成员函数,输出数据成员的值定义成员函数,输出数据成员的值 couthour:minute:secendl;void main()Time t1;/建立对象建立对象t1,同时调用构造函数,同时调用构造函数t1.Time()t1.set_
8、time();/对对t1的数据成员赋值的数据成员赋值t1.show_time();/显示显示t1的数据成员的值的数据成员的值 Time t2;/建立对象建立对象t2,同时调用构造函数,同时调用构造函数t2.Time()t2.show_time();/显示显示t2的数据成员的值的数据成员的值92023/4/17带参的构造函数的应用示例带参的构造函数的应用示例【实例实例11-1-2】定义一个描述学生的类(包括:学号、姓名、定义一个描述学生的类(包括:学号、姓名、年龄和班级号)及该类的对象,使用构造函数初始化数据年龄和班级号)及该类的对象,使用构造函数初始化数据成员。成员。102023/4/17/#
9、include st.h#include#include#include class TStudent public:TStudent(char*sn,char*name,int age,int cn);/说明构造函数说明构造函数 void ShowStudent();private:char sno5;char sname10;int sage;int cno;构造函数的应用示例构造函数的应用示例112023/4/17/定义构造函数定义构造函数TStudent:TStudent(char*sn,char*name,int age,int cn)strcpy(sno,sn);strcpy(sn
10、ame,name);sage=age;cno=cn;void TStudent:ShowStudent()coutsetw(6)snosetw(12)snamesetw(6)sagesetw(5)cnoendl;构造函数的应用示例构造函数的应用示例122023/4/17#include st.hvoid main()TStudent s1(001,张红张红,18,2);cout访问类成员访问类成员n;coutsetw(6)snosetw(12)snamesetw(6)sagesetw(6)cnon;s1.ShowStudent();构造函数的应用示例构造函数的应用示例132023/4/17【说
11、明说明】(1)构造函数的名字)构造函数的名字TStudent与类名与类名TStudent相同。相同。(2)在建立对象)在建立对象s1时自动调用构造函数,给该对象时自动调用构造函数,给该对象中的成员赋初值中的成员赋初值(001,张红张红,18,2)。)。(3)由于构造函数不能显示调用,因此,实参是在)由于构造函数不能显示调用,因此,实参是在定义对象时给出的。定义对象时给出的。构造函数的应用构造函数的应用142023/4/17在一个类中可以定义多个构造函数,以便对类在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。这些对象提供不同的初始化的方法,供用户选用。这些构造函
12、数具有相同的名字,而参数的个数或参数的构造函数具有相同的名字,而参数的个数或参数的类型不相同。这称为构造函数的重载。类型不相同。这称为构造函数的重载。构造函数的重载构造函数的重载【实例实例11-1-3】定义一个描述学生的类(包括:学号、定义一个描述学生的类(包括:学号、姓名、年龄和班级号)及该类的对象,使用重载、姓名、年龄和班级号)及该类的对象,使用重载、带缺省形参值的构造函数初始化数据成员。带缺省形参值的构造函数初始化数据成员。152023/4/17构造函数的重载构造函数的重载#include#include#include class TStudent public:TStudent(ch
13、ar*sn,char*name,int age,int cn);TStudent(int cn=3);/指定缺省参数的值指定缺省参数的值 void ShowStudent();private:char sno5;char sname10;int sage,cno;162023/4/17构造函数的重载构造函数的重载TStudent:TStudent(char*sn,char*name,int age,int cn)/构造函数定义构造函数定义 strcpy(sno,sn);strcpy(sname,name);sage=age;cno=cn;/重载、带缺省形参值构造函数的定义重载、带缺省形参值构造
14、函数的定义TStudent:TStudent(int cn)strcpy(sno,002);strcpy(sname,李力李力);sage=20;cno=cn;void TStudent:ShowStudent()coutsetw(6)snosetw(12)snamesetw(6)sagesetw(5)cnoendl;172023/4/17构造函数的重载构造函数的重载#include st.hvoid main()TStudent s1(001,张红张红,18,2),s2,s3(1);cout访问类成员访问类成员n;coutsetw(6)snosetw(12)snamesetw(6)sages
15、etw(6)cnon;s1.ShowStudent();s2.ShowStudent();s3.ShowStudent();182023/4/17构造函数的重载构造函数的重载【说明说明】(1)在执行语句)在执行语句TStudent s1(001,张红张红,18,2)时建立对象时建立对象s1,并自动调用具有,并自动调用具有4个参数的构造函个参数的构造函数数TStudent(char*sn,char*name,int age,int cn),给该对象中的成员赋初值给该对象中的成员赋初值(001,张红张红,18,2)。)。(2)在执行语句)在执行语句TStudent s2;时建立对象时建立对象s2,
16、并自,并自动调用重载、并带缺省形参值的构造函数动调用重载、并带缺省形参值的构造函数TStudent(3)。(3)在执行语句)在执行语句TStudent s3(1);时建立对象时建立对象s3,并,并自动调用重载构造函数自动调用重载构造函数TStudent(1)。192023/4/1711.1.2 用参数初始化表对数据成员初始化用参数初始化表对数据成员初始化前前面面介介绍绍的的是是在在构构造造函函数数的的函函数数体体内内通通过过赋赋值值语语句句对对数数据据成成员员实实现现初初始始化化。C+还还提提供供另另一一种种初初始始化化数数据据成成员员的的方方法法参参数数初初始始化化表表来来实实现现对对数数据
17、据成成员员的的初初始始化化。这这种种方方法法不不在在函函数数体体内内对对数据成员初始化,而是在函数首部实现。数据成员初始化,而是在函数首部实现。带有成员初始化表的构造函数的一般形式如下:带有成员初始化表的构造函数的一般形式如下:类名类名:构造函数名构造函数名(参数表参数表):(成员初始化表成员初始化表)/构造函数体构造函数体成员初始化表的一般形式为:成员初始化表的一般形式为:数据成员名数据成员名1(初始值初始值1),数据成员名数据成员名2(初始值初始值2),202023/4/17用参数初始化表对数据成员初始化实例用参数初始化表对数据成员初始化实例【实实例例11-1-4】定定义义一一个个描描述述
18、学学生生的的类类(包包括括:学学号号、姓姓名名、年年龄龄和和班班级级号号),及及该该类类的的对对象象,使使用成员初始化表初始化数据成员。用成员初始化表初始化数据成员。212023/4/17用参数初始化表对数据成员初始化实例用参数初始化表对数据成员初始化实例#include#include#include class TStudent public:TStudent(char*sn,char*name,int age,int cn);void ShowStudent();private:char sno5;char sname10;int sage;int cno;222023/4/17用参数初
19、始化表对数据成员初始化实例用参数初始化表对数据成员初始化实例/使用成员初始化表初始化数据成员使用成员初始化表初始化数据成员TStudent:TStudent(char*sn,char*name,int age,int cn):sage(age),cno(cn)/初始化数据成员初始化数据成员 strcpy(sno,sn);strcpy(sname,name);void TStudent:ShowStudent()coutsetw(6)snosetw(12)snamesetw(6)sagesetw(5)cnoendl;232023/4/17用参数初始化表对数据成员初始化实例用参数初始化表对数据成员
20、初始化实例void main()TStudent s1(001,张红张红,20,2);cout访问类成员访问类成员n;coutsetw(6)snosetw(12)snamesetw(6)sagesetw(6)cnon;s1.ShowStudent();【说明说明】在执行语句在执行语句TStudent s1(001,张红张红,18,2);时建立对象时建立对象s1,并自动调用构造函数,并自动调用构造函数TStudent(char*sn,char*name,int age,int cn):sage(age),cno(cn),给该对象中的成员赋初值,给该对象中的成员赋初值(001,张红张红,20,2)
21、。)。242023/4/1711.1.3 析构函数析构函数析构函数也是一种特殊的成员函数。其功能与析构函数也是一种特殊的成员函数。其功能与构造函数的功能正好相反,是用来释放一个对象,构造函数的功能正好相反,是用来释放一个对象,在对象删除前,用它来做一些清理工作。在对象删除前,用它来做一些清理工作。析构函数具有以下一些特点:析构函数具有以下一些特点:(1)析构函数名与构造函数名相同,但它前面必须析构函数名与构造函数名相同,但它前面必须加一个波浪号加一个波浪号(),用以区别于构造函数。,用以区别于构造函数。(2)在定义析构函数时,不能指定任何返回类型,)在定义析构函数时,不能指定任何返回类型,也没
22、有参数,而且不能重载。因此在一个类中只能也没有参数,而且不能重载。因此在一个类中只能有一个析构函数。有一个析构函数。(3)析构函数可以被显示调用,也可以被系统自动)析构函数可以被显示调用,也可以被系统自动调用。调用。252023/4/17析构函数析构函数在下面两种情况下,析构函数会被系统自动调用:在下面两种情况下,析构函数会被系统自动调用:如果一个对象被定义在一个函数体内,则当这个函数如果一个对象被定义在一个函数体内,则当这个函数结束时,该对象的析构函数被自动调用。结束时,该对象的析构函数被自动调用。当一个对象是使用当一个对象是使用new运算符动态创建的,在使用运算符动态创建的,在使用dele
23、te运算符释放它时,运算符释放它时,delete将会自动调用析构函数。将会自动调用析构函数。每个类必须有一个析构函数。若没有显式地为一个类定每个类必须有一个析构函数。若没有显式地为一个类定义析构函数,编译系统会自动地生成一个缺省的析构函义析构函数,编译系统会自动地生成一个缺省的析构函数,其格式如下:数,其格式如下::缺省析构函数是一个空函数。实际上什么操作都缺省析构函数是一个空函数。实际上什么操作都不进行。不进行。262023/4/17析构函数实例析构函数实例【实实例例11-1-5】在在学学生生类类(包包括括:学学号号、姓姓名名、年年龄龄和和班班级级号)中使用构造函数和析构函数。号)中使用构造
24、函数和析构函数。#include#include#include class TStudent public:TStudent(char*sn,char*name,int age,int cn);TStudent();/说明析构函数说明析构函数 void ShowStudent();private:char sno5;char sname10;int sage;int cno;272023/4/17析构函数实例析构函数实例TStudent:TStudent(char*sn,char*name,int age,int cn)定义构造函数定义构造函数 cout构造函数被调用!构造函数被调用!n;s
25、trcpy(sno,sn);strcpy(sname,name);sage=age;cno=cn;void TStudent:ShowStudent()coutsetw(6)snosetw(12)snamesetw(6)sagesetw(5)cnoendl;TStudent:TStudent()/定义析构函数定义析构函数 cout析构函数被调用!析构函数被调用!n;282023/4/17析构函数实例析构函数实例/eg9_6.cpp文件文件#include st.h动态创建动态创建s2对象对象void main()TStudent s1(001,张红张红,18,1),*s2;s2=new TSt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 构造 函数
限制150内