构造函数与析构函数.ppt
《构造函数与析构函数.ppt》由会员分享,可在线阅读,更多相关《构造函数与析构函数.ppt(64页珍藏版)》请在三一办公上搜索。
1、1,第11章 构造函数与析构函数,教学主要内容类的构造函数析构函数静态成员友元重点与难点类与构造函数友元,2,第11章 构造函数与析构函数,教学目标(1)熟练掌握使用构造函数在创建对象时对其进行初始化(2)掌握使用析构函数在释放对象时清理现场(3)会使用友元访问类中的成员,3,第11章 构造函数与析构函数,11.1 构造函数与析构函数概述11.2 拷贝构造函数11.3 对象数组11.4 this指针11.5 静态成员11.6 友元,4,11.1.1 构造函数当建立一个对象时,对象的状态(数据成员的取值)是不确定的。常常需要初始化。C+中有一个称为构造函数的特殊成员函数,可自动进行对象的初始化。
2、相对于构造函数,一个称为析构函数的成员函数在对象撤消时自动执行清理任务。,11.1 构造函数和析构函数,5,构造函数,构造函数是一种特殊的成员函数,它的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态,给各成员数据赋初值。构造函数在对象创建时由系统自动调用。构造函数除具有一般成员函数的特性之外,还具有一些特殊的性质:(1)构造函数的名字必须与类名相同。(2)构造函数可以有任意类型的参数,但不能指定返回类型。它有隐含的返回值,该值由系统内部使用。(3)构造函数允许为内联函数、重载函数、带缺省形参值的函数。(4)构造函数被声明为公有函数,但它不能像其他成员函数那样被显式
3、地调用,它是在定义对象的同时被系统调用的。,6,构造函数的定义,在类定义时没有定义任何构造函数时,编译器会自动为这个类生成一个不带参数的缺省构造函数,其格式如下::()在程序中定义一个对象而没有进行初始化时,则编译器便按缺省构造函数来初始化该对象。只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。,7,构造函数的应用示例,【实例11-1-1】定义一个时钟类(包括:时、分、秒)及该类的对象,分别使用普通成员函数和构造函数初始化数据成员。,8,构造函数的应用示例,#include using namespace std;class Timepublic:Time()/定义构造成员函数,
4、函数名与类名相同hour=0;/利用构造函数对对象中的数据成员赋初值minute=0;sec=0;void set_time();/函数声明void show_time();/函数声明private:int hour;/私有数据成员int minute;int sec;,9,构造函数的应用示例,void Time:set_time()/定义成员函数,向数据成员赋值cinhour;cinminute;cinsec;void Time:show_time()/定义成员函数,输出数据成员的值 couthour:minute:secendl;void main()Time t1;/建立对象t1,同时调
5、用构造函数t1.Time()t1.set_time();/对t1的数据成员赋值t1.show_time();/显示t1的数据成员的值 Time t2;/建立对象t2,同时调用构造函数t2.Time()t2.show_time();/显示t2的数据成员的值,10,带参的构造函数的应用示例,【实例11-1-2】定义一个描述学生的类(包括:学号、姓名、年龄和班级号)及该类的对象,使用构造函数初始化数据成员。,11,/#include st.h#include#include#include class TStudent public:TStudent(char*sn,char*name,int ag
6、e,int cn);/说明构造函数 void ShowStudent();private:char sno5;char sname10;int sage;int cno;,构造函数的应用示例,12,/定义构造函数TStudent:TStudent(char*sn,char*name,int age,int cn)strcpy(sno,sn);strcpy(sname,name);sage=age;cno=cn;void TStudent:ShowStudent()coutsetw(6)snosetw(12)snamesetw(6)sagesetw(5)cnoendl;,构造函数的应用示例,13
7、,#include st.hvoid main()TStudent s1(001,张红,18,2);cout访问类成员n;coutsetw(6)snosetw(12)snamesetw(6)sagesetw(6)cnon;s1.ShowStudent();,构造函数的应用示例,14,【说明】(1)构造函数的名字TStudent与类名TStudent相同。(2)在建立对象s1时自动调用构造函数,给该对象中的成员赋初值(001,张红,18,2)。(3)由于构造函数不能显示调用,因此,实参是在定义对象时给出的。,构造函数的应用,15,在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法
8、,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不相同。这称为构造函数的重载。,构造函数的重载,【实例11-1-3】定义一个描述学生的类(包括:学号、姓名、年龄和班级号)及该类的对象,使用重载、带缺省形参值的构造函数初始化数据成员。,16,构造函数的重载,#include#include#include class TStudent public:TStudent(char*sn,char*name,int age,int cn);TStudent(int cn=3);/指定缺省参数的值 void ShowStudent();private:char sno5;char sn
9、ame10;int sage,cno;,17,构造函数的重载,TStudent:TStudent(char*sn,char*name,int age,int cn)/构造函数定义 strcpy(sno,sn);strcpy(sname,name);sage=age;cno=cn;/重载、带缺省形参值构造函数的定义TStudent:TStudent(int cn)strcpy(sno,002);strcpy(sname,李力);sage=20;cno=cn;void TStudent:ShowStudent()coutsetw(6)snosetw(12)snamesetw(6)sagesetw(
10、5)cnoendl;,18,构造函数的重载,#include st.hvoid main()TStudent s1(001,张红,18,2),s2,s3(1);cout访问类成员n;coutsetw(6)snosetw(12)snamesetw(6)sagesetw(6)cnon;s1.ShowStudent();s2.ShowStudent();s3.ShowStudent();,19,构造函数的重载,【说明】(1)在执行语句TStudent s1(001,张红,18,2)时建立对象s1,并自动调用具有4个参数的构造函数TStudent(char*sn,char*name,int age,i
11、nt cn),给该对象中的成员赋初值(001,张红,18,2)。(2)在执行语句TStudent s2;时建立对象s2,并自动调用重载、并带缺省形参值的构造函数TStudent(3)。(3)在执行语句TStudent s3(1);时建立对象s3,并自动调用重载构造函数TStudent(1)。,20,11.1.2 用参数初始化表对数据成员初始化,前面介绍的是在构造函数的函数体内通过赋值语句对数据成员实现初始化。C+还提供另一种初始化数据成员的方法参数初始化表来实现对数据成员的初始化。这种方法不在函数体内对数据成员初始化,而是在函数首部实现。带有成员初始化表的构造函数的一般形式如下:类名:构造函数
12、名(参数表):(成员初始化表)/构造函数体成员初始化表的一般形式为:数据成员名1(初始值1),数据成员名2(初始值2),21,用参数初始化表对数据成员初始化实例,【实例11-1-4】定义一个描述学生的类(包括:学号、姓名、年龄和班级号),及该类的对象,使用成员初始化表初始化数据成员。,22,用参数初始化表对数据成员初始化实例,#include#include#include class TStudent public:TStudent(char*sn,char*name,int age,int cn);void ShowStudent();private:char sno5;char snam
13、e10;int sage;int cno;,23,用参数初始化表对数据成员初始化实例,/使用成员初始化表初始化数据成员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;,24,用参数初始化表对数据成员初始化实例,void main()TStudent s1(001,
14、张红,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)。,25,11.1.3 析构函数,析构函数也是一种特殊的成员函数。其功能与构造函数的功能正好相反,是用来释放一个对象,在对象删除前,用它来做一些清理工作
15、。析构函数具有以下一些特点:(1)析构函数名与构造函数名相同,但它前面必须加一个波浪号(),用以区别于构造函数。(2)在定义析构函数时,不能指定任何返回类型,也没有参数,而且不能重载。因此在一个类中只能有一个析构函数。(3)析构函数可以被显示调用,也可以被系统自动调用。,26,析构函数,在下面两种情况下,析构函数会被系统自动调用:如果一个对象被定义在一个函数体内,则当这个函数结束时,该对象的析构函数被自动调用。当一个对象是使用new运算符动态创建的,在使用delete运算符释放它时,delete将会自动调用析构函数。每个类必须有一个析构函数。若没有显式地为一个类定义析构函数,编译系统会自动地生
16、成一个缺省的析构函数,其格式如下::缺省析构函数是一个空函数。实际上什么操作都不进行。,27,析构函数实例,【实例11-1-5】在学生类(包括:学号、姓名、年龄和班级号)中使用构造函数和析构函数。,#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;,28,析构函数实例,TStudent:TStud
17、ent(char*sn,char*name,int age,int cn)定义构造函数 cout构造函数被调用!n;strcpy(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;,29,析构函数实例,/eg9_6.cpp文件#include st.h动态创建s2对象void main()TStudent s1(001,
18、张红,18,1),*s2;s2=new TStudent(002,李力,20,2);coutShowStudent();delete s2;,30,调用构造函数和析构函数的顺序,31,11.3 对象数组,数组不仅可以由简单变量组成,也可以由对象组成,即对象数组的每一个元素都是同类的对象。,例如一个班有50个学生,每个学生的属性包括姓名、性别、年龄、成绩等。这时可以定义一个“学生类”对象数组,每一个数组元素是一个“学生类”对象。例如:/假设已声明了Student类,定义stud数组,有50个元素TStudent stud50;,【格式】类名 对象数组名长度,32,在对象数组中使用构造函数,在建立
19、数组时,同样要调用构造函数。如果有50个元素,需要调用50次构造函数。在需要时可以在定义数组时提供实参以实现初始化。1.构造函数只有一个参数如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供实参。例如:TStudent stud3=60,70,78;/合法,3个实参分别传递给3个数组元素的构造函数,33,在对象数组中使用构造函数,2.构造函数有多个参数如果构造函数有多个参数,在定义对象数组时在花括号中分别写出构造函数并指定实参。如果构造函数有3个参数,分别代表学号、年龄、成绩。则可以这样定义对象数组:TStudent Stud3=/调用第1个元素的构造函数,为它提供3个实参
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 构造 函数
链接地址:https://www.31ppt.com/p-6301438.html