构造函数与析构函数.ppt

上传人:wuy****n92 文档编号:88366772 上传时间:2023-04-25 格式:PPT 页数:64 大小:304.49KB
返回 下载 相关 举报
构造函数与析构函数.ppt_第1页
第1页 / 共64页
构造函数与析构函数.ppt_第2页
第2页 / 共64页
点击查看更多>>
资源描述

《构造函数与析构函数.ppt》由会员分享,可在线阅读,更多相关《构造函数与析构函数.ppt(64页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

26、udent(002,李力李力,20,2);cout访问类成员访问类成员n;coutsetw(6)snosetw(12)snamesetw(6)sagesetw(6)ShowStudent();delete s2;292023/4/17调用构造函数和析构函数的顺序调用构造函数和析构函数的顺序302023/4/1711.3 对象数组对象数组数组不仅可以由简单变量组成,也可以数组不仅可以由简单变量组成,也可以由对象组成,即对象数组的每一个元素都是同由对象组成,即对象数组的每一个元素都是同类的对象。类的对象。例如一个班有例如一个班有50个学生,每个学生的属性包括个学生,每个学生的属性包括姓名、性别、年

27、龄、成绩等。这时可以定义一个姓名、性别、年龄、成绩等。这时可以定义一个“学学生类生类”对象数组,每一个数组元素是一个对象数组,每一个数组元素是一个“学生类学生类”对象。例如对象。例如:/假设已声明了假设已声明了Student类,定义类,定义stud数组,有数组,有50个元素个元素TStudent stud50;【格式格式】类名类名 对象数组名对象数组名长度长度 312023/4/17在对象数组中使用构造函数在对象数组中使用构造函数在建立数组时,同样要调用构造函数。在建立数组时,同样要调用构造函数。如果有如果有50个元素,需要调用个元素,需要调用50次构造函数。在次构造函数。在需要时可以在定义数

28、组时提供实参以实现初始需要时可以在定义数组时提供实参以实现初始化。化。1.构造函数只有一个参数构造函数只有一个参数如果构造函数只有一个参数,在定义数组时可如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供实参。以直接在等号后面的花括号内提供实参。例如:例如:TStudent stud3=60,70,78;/合法,合法,3个实个实参分别传递给参分别传递给3个数组元素的构造函数个数组元素的构造函数322023/4/17在对象数组中使用构造函数在对象数组中使用构造函数2.构造函数有多个参数构造函数有多个参数如果构造函数有多个参数,在定义对象如果构造函数有多个参数,在定义对象数组时

29、在花括号中分别写出构造函数并指定实数组时在花括号中分别写出构造函数并指定实参。如果构造函数有参。如果构造函数有3个参数,分别代表学号、个参数,分别代表学号、年龄、成绩。则可以这样定义对象数组:年龄、成绩。则可以这样定义对象数组:TStudent Stud3=/调用第调用第1个元素的构造函数,为它提供个元素的构造函数,为它提供3个实参个实参TStudent(1001,18,87),TStudent(1002,19,76),TStudent(1003,18,72);332023/4/17对象数组应用实例对象数组应用实例【实例实例11-3-1】定义一个描述学生的类(包括:定义一个描述学生的类(包括:

30、学号、姓名、年龄和班级号)及该类的对象数学号、姓名、年龄和班级号)及该类的对象数组,使用构造函数初始化数据成员。组,使用构造函数初始化数据成员。342023/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;352023/4/17对象数组应用实例对象数组应用实例TSt

31、udent: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;362023/4/17对象数组应用实例对象数组应用实例/#include st.hvoid main()TStudent s13=TStudent(“001”,“张红张红”,18,2),TStudent(“002”,“李江李江”,19,3),T

32、Student(“003”,“王琴王琴,18,1);cout访问类成员访问类成员n;coutsetw(6)snosetw(12)snamesetw(6)sagesetw(6)cnon;for(int i=0;i3;i+)s1i.ShowStudent();372023/4/1711.5 静态成员静态成员由于系统只为变量分配存储空间,不为类型分由于系统只为变量分配存储空间,不为类型分配存储空间,因此,不能用关键词配存储空间,因此,不能用关键词register、auto、extern来修饰类中的成员。但可以用来修饰类中的成员。但可以用static来修饰成来修饰成员,被修饰的成员称为静态成员。员,被

33、修饰的成员称为静态成员。静态成员有别于静态成员有别于其他存储类型的成员,它不是某个对象的成员,而其他存储类型的成员,它不是某个对象的成员,而是所有该类对象都共享的成员。是所有该类对象都共享的成员。可以利用静态成员可以利用静态成员的这一特性,的这一特性,存储共享信息或进行数据传递。存储共享信息或进行数据传递。静态成员包括静态数据成员和静态成员函数。静态成员包括静态数据成员和静态成员函数。382023/4/1711.5.1 静态数据成员静态数据成员静态数据成员在生成每一个类的对象时并不分配存储静态数据成员在生成每一个类的对象时并不分配存储空间,而是该类的每个对象共享一个公共的存储空间,并且空间,而

34、是该类的每个对象共享一个公共的存储空间,并且该类的所有对象都可以直接访问该存储空间。该类的所有对该类的所有对象都可以直接访问该存储空间。该类的所有对象维护该成员的同一个拷贝,从而实现了同一个类的不同对象维护该成员的同一个拷贝,从而实现了同一个类的不同对象之间的数据共享。象之间的数据共享。必须在创建该类的对象之前为静态成员分配存储空间必须在创建该类的对象之前为静态成员分配存储空间并设置初值。并设置初值。分配存储空间并设置初值的格式为:分配存储空间并设置初值的格式为:静态成员数据类型静态成员数据类型 类名类名:静态数据成员静态数据成员=初值初值;若静态数据成员没有进行初始化,则自动被初始化为若静态

35、数据成员没有进行初始化,则自动被初始化为0。392023/4/17静态数据成员应用实例静态数据成员应用实例【实例实例11-5-1】在学生类(包括:学号、姓名、成绩)中,计在学生类(包括:学号、姓名、成绩)中,计算学生的总成绩、平均成绩和学生人数。算学生的总成绩、平均成绩和学生人数。【编程思路编程思路】学生的总成绩、平均成绩和学生人数应该是每个学生共享的数学生的总成绩、平均成绩和学生人数应该是每个学生共享的数据,因此,将其说明为静态数据成员。据,因此,将其说明为静态数据成员。402023/4/17静态数据成员应用实例静态数据成员应用实例#include#include#include class

36、 TStudent public:TStudent(char*name,char*st_no,float score1);TStudent();void show_st();/输出姓名、学号和成绩输出姓名、学号和成绩 void show_count_sum_avg();/输出学生人数、总成绩和平输出学生人数、总成绩和平均成绩均成绩private:char*sno;char*sname;float score;static int count;/静态数据成员静态数据成员 static float sum;static float avg;412023/4/17静态数据成员应用实例静态数据成员应用

37、实例TStudent:TStudent(char*name,char*st_no,float score1)sname=new charstrlen(name)+1;strcpy(sname,name);sno=new charstrlen(st_no)+1;strcpy(sno,st_no);score=score1;+count;/累加学生人数累加学生人数sum=sum+score;/累加总成绩累加总成绩 avg=sum/count;/计算平均成绩计算平均成绩 TStudent:TStudent()delete sname;delete sno;422023/4/17静态数据成员应用实例静

38、态数据成员应用实例void TStudent:show_st()/输出学生信息输出学生信息 coutsetw(7)sno;coutsetw(8)sname;coutsetw(8)score;void TStudent:show_count_sum_avg()/输出静态数据成员输出静态数据成员 coutsetw(8)sum;coutsetw(10)avg;coutsetw(8)countendl;int TStudent:count=0;/初始化静态数据成员初始化静态数据成员float TStudent:sum=0.0;float TStudent:avg=0.0;432023/4/17静态数据

39、成员应用实例静态数据成员应用实例#include st.hvoid main()cout sno sname score sum avg countn;TStudent st1(李力李力,001,92);st1.show_st();st1.show_count_sum_avg();TStudent st2(张红张红,002,86);st2.show_st();st2.show_count_sum_avg();TStudent st3(杨阳杨阳,003,73);st3.show_st();st3.show_count_sum_avg();442023/4/17静态数据成员应用实例静态数据成员应用

40、实例【说明说明】(1)静态数据成员能在类说明符中声明,但不能在其)静态数据成员能在类说明符中声明,但不能在其中定义。中定义。(2)对于静态数据成员的初始化不能在构造函数中进)对于静态数据成员的初始化不能在构造函数中进行。行。(3)所有的)所有的TStudent对象对象st1、st2和和st3共享静态数据成共享静态数据成员员count、sum和和avg。452023/4/1711.5.2 静态成员函数静态成员函数静态成员函数和静态数据成员一样,他们都静态成员函数和静态数据成员一样,他们都属于类的静态成员,他们都不是对象成员。因此,属于类的静态成员,他们都不是对象成员。因此,引用静态成员不需要对象

41、名。静态成员函数只能引用静态成员不需要对象名。静态成员函数只能直接访问类中的静态数据成员,而不能直接访问直接访问类中的静态数据成员,而不能直接访问类中的非静态数据成员,若要访问类中的非静态类中的非静态数据成员,若要访问类中的非静态数据成员,可通过对象来引用。数据成员,可通过对象来引用。462023/4/17静态成员函数应用实例静态成员函数应用实例【实例实例11-5-2】在学生类(包括:学号、姓名、成绩)中,在学生类(包括:学号、姓名、成绩)中,计算学生的总成绩、平均成绩和学生人数。利用静态成员计算学生的总成绩、平均成绩和学生人数。利用静态成员函数输出学生的信息。函数输出学生的信息。472023

42、/4/17静态成员函数应用实例静态成员函数应用实例#include#include#include class TStudent public:TStudent(char*name,char*st_no,float score1);static void show_st(TStudent x);/静态成员函数静态成员函数 private:char*sno;char*sname;float score;static int count;static float sum;static float avg;482023/4/17静态成员函数应用实例静态成员函数应用实例TStudent:TStuden

43、t(char*name,char*st_no,float score1)sname=new charstrlen(name)+1;strcpy(sname,name);sno=new charstrlen(st_no)+1;strcpy(sno,st_no);score=score1;+count;/累加学生人数累加学生人数sum=sum+score;/累加总成绩累加总成绩 avg=sum/count;/计算平均成绩计算平均成绩 492023/4/17静态成员函数应用实例静态成员函数应用实例/在静态成员函数中访问静态数据成员和非静态数据成员在静态成员函数中访问静态数据成员和非静态数据成员voi

44、d TStudent:show_st(TStudent x)coutsetw(7)x.sno;coutsetw(8)x.sname;coutsetw(8)x.score;coutsetw(8)sum;coutsetw(10)avg;coutsetw(8)countendl;int TStudent:count=0;float TStudent:sum=0.0;float TStudent:avg=0.0;502023/4/17静态成员函数应用实例静态成员函数应用实例#include st.hvoid main()cout sno sname score sum avg countn;TStud

45、ent st1(李力李力,001,92);TStudent:show_st(st1);/访问静态成员函数访问静态成员函数 TStudent st2(张红张红,002,86);TStudent:show_st(st2);TStudent st3(杨阳杨阳,003,73);TStudent:show_st(st3);【说明说明】在静态成员函数中可以直接访问静态数据成员,在静态成员函数中可以直接访问静态数据成员,访问非静态数据成员要指明其对象,如访问非静态数据成员要指明其对象,如x.sno。512023/4/1711.6 友元友元友元提供了不同类或对象的成员函数之间、友元提供了不同类或对象的成员函数

46、之间、类的成员函数与一般函数之间进行数据共享的机类的成员函数与一般函数之间进行数据共享的机制。对于一个类,可以利用关键字制。对于一个类,可以利用关键字friend将一般将一般函数、其他类的成员函数或者其他类声明为该类函数、其他类的成员函数或者其他类声明为该类的友元,使得这个类中本来隐藏的信息(包括私的友元,使得这个类中本来隐藏的信息(包括私有成员和保护成员)可以被友元所访问。有成员和保护成员)可以被友元所访问。522023/4/1711.6.1 友元函数友元函数友元函数是一种定义在类外面的普通函数,友元函数是一种定义在类外面的普通函数,而不是类的成员函数。为区别友元函数与类的成而不是类的成员函

47、数。为区别友元函数与类的成员函数,在说明友元函数时前面加关键字员函数,在说明友元函数时前面加关键字friend。尽管友元函数不是类的成员函数,但它可以访。尽管友元函数不是类的成员函数,但它可以访问类的所有成员,包括私有成员、保护成员和公问类的所有成员,包括私有成员、保护成员和公有成员。有成员。友元函数要在类定义时说明,说明时要在其函数友元函数要在类定义时说明,说明时要在其函数名前加上关键字名前加上关键字friend。该说明可以放在公有部。该说明可以放在公有部分,也可以放在私有部分。友元函数的定义既可分,也可以放在私有部分。友元函数的定义既可以在类内部进行,也可以在类外进行。以在类内部进行,也可

48、以在类外进行。532023/4/17友元函数应用实例友元函数应用实例【实例实例11-6-1】定义一个点(定义一个点(Tpoint)类,计算两点之间)类,计算两点之间的距离。的距离。【编程思路编程思路】本实例利用友元函数访问本实例利用友元函数访问Tpoint类中的数据成员,从而计类中的数据成员,从而计算两点之间的距离。算两点之间的距离。542023/4/17友元函数应用实例友元函数应用实例#include class TPoint public:TPoint(int x,int y);int getX()return xVal;int getY()return yVal;private:int

49、xVal;int yVal;friend void Distance(TPoint a,TPoint b);/说明友元函数说明友元函数;TPoint:TPoint(int x,int y)if(x=0&x=0&y480)xVal=x;yVal=y;552023/4/17友元函数应用实例友元函数应用实例/利用友元函数访问对象的成员利用友元函数访问对象的成员void Distance(TPoint a,TPoint b)double d;int dx=;int dy=;d=sqrt(dx*dx+dy*dy);coutThe distance between ;coutp1(a.getX(),a.g

50、etY()and;coutp2(b.getX(),b.getY();cout is dendl;562023/4/17友元函数应用实例友元函数应用实例#include#include pt.hvoid main()TPoint p1(10,20),p2(12,6);double d;Distance(p1,p2);【说明说明】(1)友员的声明可以放置在类中的任意位置。)友员的声明可以放置在类中的任意位置。(2)为了确保数据的完整性,及数据封装与隐藏的原则,)为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元。建议尽量不使用或少使用友元。572023/4/1711.6.2

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁