第3讲类和对象优秀PPT.ppt

上传人:石*** 文档编号:65722478 上传时间:2022-12-06 格式:PPT 页数:50 大小:2.20MB
返回 下载 相关 举报
第3讲类和对象优秀PPT.ppt_第1页
第1页 / 共50页
第3讲类和对象优秀PPT.ppt_第2页
第2页 / 共50页
点击查看更多>>
资源描述

《第3讲类和对象优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第3讲类和对象优秀PPT.ppt(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第3讲类和对象讲类和对象现在学习的是第1页,共50页类的定义格式:类的定义格式:class 类名类名 private:成员数据成员数据;成员函数;成员函数;public:成员数据成员数据;成员函数;成员函数;protected:成员数据成员数据;成员函数;成员函数;;关键字关键字类名类名私有私有公有公有保护保护class Student private:char Name20;float Math;float Chiese;public:float average;void SetName(char*name);void SetMath(float math);void SetChinese

2、(float ch);float GetAverage(void);分号不能少分号不能少现在学习的是第2页,共50页C+有有三三种种访访问问控控制制属属性性:public表表示示成成员员是是公公 有有 的的,private表表 示示 成成 员员 是是 私私 有有 的的,protected表示成员是受保护的。表示成员是受保护的。缺缺省省情情况况下下,类类中中说说明明的的所所有有函函数数和和变变量量都都为为这个类所私有这个类所私有private。私有成员只能被私有成员只能被本类本类的成员函数访问。的成员函数访问。公公有有成成员员不不但但可可以以被被本本类类的的其其它它成成员员访访问问,还还可可以以

3、被程序中该被程序中该类以外的对象类以外的对象访问。访问。保保护护成成员员可可以以由由本本类类的的成成员员访访问问,也也可可以以由由本本类类的的派生类派生类的成员访问。的成员访问。类成员的访问控制类成员的访问控制现在学习的是第3页,共50页类成员的访问控制类成员的访问控制私有成员私有成员公有成员公有成员保护成员保护成员类内函数类内函数可以调用可以调用可以调用可以调用可以调用可以调用类外函数类外函数不可调用不可调用可以调用可以调用不可调用不可调用私有函数私有函数公有函数公有函数保护函数保护函数类内函数类内函数可以调用可以调用可以调用可以调用可以调用可以调用类外函数类外函数不可调用不可调用可以调用可

4、以调用不可调用不可调用现在学习的是第4页,共50页class A float x,y;public:void Setxy(float a,float b)x=a;y=b;void Print(void)coutxtyendl;xySetxy()Print()A私有数据私有数据公有函数公有函数在在类外不能直接使用类外不能直接使用 x 或或 y,必须通过,必须通过Setxy()给给 x 或或 y 赋值,通过赋值,通过Print()输出输出 x 或或 y。类成员的访问控制现在学习的是第5页,共50页在类体内定义成员函数在类体内定义成员函数类的成员函数类的成员函数class A float x,y;p

5、ublic:void Setxy(float a,float b)x=a;y=b;void Print(void)coutxtyendl;在类体内定义在类体内定义成员函数成员函数现在学习的是第6页,共50页class A float x,y;public:void Setxy(float a,float b);void Print(void);;void A:Setxy(float a,float b)x=a;y=b;void A:Print(void)coutxtyendl;在类体内说明成在类体内说明成员函数原型员函数原型在类体外定义在类体外定义成员函数成员函数在类体外定义成员函数在类体外定

6、义成员函数类的成员函数类的成员函数现在学习的是第7页,共50页 :()./函数体函数体在类体外定义成员函数的格式:在类体外定义成员函数的格式:void A:Setxy(float a,float b)x=a;y=b;函数类型函数类型类名类名函数名函数名形参列表形参列表函数体函数体类的成员函数类的成员函数现在学习的是第8页,共50页在在类类中中直直接接定定义义的的成成员员函函数数在在编编译译时时是是作作为为内内联联函函数数来实现的。来实现的。也也可可以以在在类类体体外外定定义义类类的的内内联联成成员员函函数数,在在类类体体外外定义时,在成员函数的定义前面加上关键字定义时,在成员函数的定义前面加上

7、关键字inlineinline。类的成员函数类的成员函数class A、float x,y;public:void Setxy(float a,float b);void Print(void);;inline void A:Setxy(float a,float b)x=a;y=b;inline void A:Print(void)coutxtyendl;现在学习的是第9页,共50页类和对象的关系相当于普通数据类型与其变量的关类和对象的关系相当于普通数据类型与其变量的关系,如:系,如:A ob1,ob2;在定义类时,只是定义了一种在定义类时,只是定义了一种数据类型数据类型,并不为类并不为类分

8、配存储空间。只有在定义了属于类的变量后,系统分配存储空间。只有在定义了属于类的变量后,系统才会为才会为类的变量类的变量分配空间。分配空间。建立对象时,只为对象分配用于保存数据成员的内存建立对象时,只为对象分配用于保存数据成员的内存空间,空间,而成员函数的代码为该类的每一个对象所而成员函数的代码为该类的每一个对象所共享共享。对象的定义及使用对象的定义及使用类名类名对象名对象名现在学习的是第10页,共50页class A float x,y;public:void Setxy(float a,float b )x=a;y=b;void Print(void)coutxtyendl;a1,a2;vo

9、id main(void)A a3,a4;定义全局对象定义全局对象定义局部对象定义局部对象对象的定义及使用对象的定义及使用现在学习的是第11页,共50页class A float x,y;public:float m,n;void Setxy(float a,float b )x=a;y=b;void Print(void)coutxtyendl;void main(void)A a1,a2;/定义对象定义对象 a1.m=10;a1.n=20;/为公有成员数据赋值为公有成员数据赋值 a1.Setxy(2.0,5.0);/为私有成员数据赋值为私有成员数据赋值 a1.Print();Print()

10、Setxy()a1nmyxPrint()Setxy()a2nmyx10202.05.0输出:输出:2 5对象的定义及使用对象的定义及使用对象成员的访问形式:对象名对象成员的访问形式:对象名.对象成员对象成员现在学习的是第12页,共50页用点运算符用点运算符“.”只能访问对象的只能访问对象的公有成员公有成员,不能访问,不能访问对象的私有成员或保护成员。对象的私有成员或保护成员。若要访问对象的私有的数据成员,只能通过对象的公若要访问对象的私有的数据成员,只能通过对象的公有成员函数来获取有成员函数来获取。见下例:见下例:对象的定义及使用对象的定义及使用现在学习的是第13页,共50页class A f

11、loat x,y;public:float m,n;void Setxy(float a,float b )x=a;y=b;void Print(void)coutxtyendl;void main(void)A a1,a2;a1.m=10;a1.n=20;/为公有成员数据赋值为公有成员数据赋值 a1.x=2;a1.y=5;a1.Setxy(2.0,5.0);a1.Print();必须通过类内公有函数必须通过类内公有函数访问私有数据成员访问私有数据成员非法,私有成员不能非法,私有成员不能在类外访问在类外访问现在学习的是第14页,共50页同类型的对象之间可以整体赋值,例:同类型的对象之间可以整体

12、赋值,例:#include class A float x,y;public:float m,n;void Setxy(float a,float b )x=a;y=b;void Print(void)coutxtyendl;void main(void)A a1,a2;a1.m=10;a1.n=20;/为公有成员数据赋值为公有成员数据赋值 a1.Setxy(2.0,5.0);a2=a1;a1.Print();a2.Print();couta2.m=a2.m a2.n=a2.nendl;对象的定义及使用对象的定义及使用现在学习的是第15页,共50页构造函数和析构函数构造函数和析构函数构造函数和

13、析构函数是在类体中说明的两种构造函数和析构函数是在类体中说明的两种特殊的成特殊的成员函数员函数。构造函数是在创建对象时,使用给定的值来将对构造函数是在创建对象时,使用给定的值来将对象初始化。象初始化。析构函数的功能正好相反,是在系统释放对象前,对析构函数的功能正好相反,是在系统释放对象前,对对象做一些善后工作对象做一些善后工作。构造函数构造函数可以带参数、可以重载可以带参数、可以重载,同时没有返回值。,同时没有返回值。构造函数是类的成员函数,系统约定构造函数名必须构造函数是类的成员函数,系统约定构造函数名必须与类名相同。与类名相同。现在学习的是第16页,共50页class A float x,

14、y;public:A(float a,float b)x=a;y=b;/构造函数,初始化对象构造函数,初始化对象 float Sum(void)return x+y;void Set(float a,float b)x=a;y=b;Print(void)coutx=xty=yendl;void main()A a1(2.0,3.0);/定义时调用构造函数初始化定义时调用构造函数初始化 A a2(1.0,2.0);a2.Set(10.0,20.0);/利用成员函数重新为对象赋值利用成员函数重新为对象赋值 a1.Print();a2.Print();现在学习的是第17页,共50页构造函数的函数名必

15、须与类名相同构造函数的函数名必须与类名相同。定义构造函数时,定义构造函数时,不能指定函数返回值的类型,也不不能指定函数返回值的类型,也不能指定为能指定为void类型类型。一个类可以定义若干个构造函数,进行一个类可以定义若干个构造函数,进行构造函数的重构造函数的重载。载。构造函数可以指定参数的缺省值。构造函数可以指定参数的缺省值。若定义的类要说明该类的对象时,构造函数必须是若定义的类要说明该类的对象时,构造函数必须是公有公有的成员函数的成员函数。如果定义的类仅用于派生其它类时,则。如果定义的类仅用于派生其它类时,则可将构造函数定义为可将构造函数定义为保护的成员函数保护的成员函数。构造函数构造函数

16、现在学习的是第18页,共50页class Afloat x,y;public:A(float a,float b=10)x=a;y=b;A()x=0;y=0;void Print(void)coutxtyendl;void main(void)A a1,a2(20.0),a3(3.0,7.0);a1.Print();a2.Print();a3.Print();带缺省参数的构造函数带缺省参数的构造函数不带参数的构造函数不带参数的构造函数每一个对象必须每一个对象必须要有相应的构造要有相应的构造函数函数现在学习的是第19页,共50页每一个对象必须要有相应的构造函数每一个对象必须要有相应的构造函数若没

17、有显式定义构造函数,系若没有显式定义构造函数,系统默认缺省的构造函数。统默认缺省的构造函数。class A float x,y;public:A()void Print(void)coutxtyendl;隐含的缺省的构造函数隐含的缺省的构造函数A a1,a2;只允许这样定义对象只允许这样定义对象对象开辟了空间,但没有初始化对象开辟了空间,但没有初始化现在学习的是第20页,共50页缺省的构造函数缺省的构造函数定义类时,若没有定义类的构造函数,则编译器定义类时,若没有定义类的构造函数,则编译器自动自动产产生一个缺省的构造函数,格式为:生一个缺省的构造函数,格式为:className:classNa

18、me()缺省的构造函数不对所产生对象的数据成员赋初值。缺省的构造函数不对所产生对象的数据成员赋初值。定义类时,定义类时,只要只要显式显式定义了一个类的构造函数,则编定义了一个类的构造函数,则编译器就不产生缺省的构造函数译器就不产生缺省的构造函数所有的对象在定义时,必须调用构造函数,所有的对象在定义时,必须调用构造函数,不存在不存在没有构造函数的对象!没有构造函数的对象!若定义了没有参数的构造函数,或各参数均有缺省值的若定义了没有参数的构造函数,或各参数均有缺省值的构造函数也称为缺省的构造函数,构造函数也称为缺省的构造函数,缺省的构造函数只能缺省的构造函数只能有一个。有一个。现在学习的是第21页

19、,共50页class Afloat x,y;public:A(float a,float b)x=a;y=b;void Print(void)coutxtyendl;void main(void)A a1;A a2(3.0,30.0);显式定义了构造函数,不产生显式定义了构造函数,不产生缺省的构造函数缺省的构造函数error,定义时,没有构定义时,没有构造函数可供调用造函数可供调用现在学习的是第22页,共50页class Afloat x,y;public:A(float a=10,float b=20)x=a;y=b;A()void Print(void)coutxtyendl;void m

20、ain(void)A a1;A a2(3.0,30.0);两个函数均为缺省两个函数均为缺省的构造函数的构造函数两个构造函数均可供调用,构造函数不唯一两个构造函数均可供调用,构造函数不唯一现在学习的是第23页,共50页构造函数与构造函数与new运算符运算符可以使用可以使用new运算符来运算符来动态地动态地建立对象。建立时建立对象。建立时要要自动调用构造函数自动调用构造函数,以便完成初始化对象的数据成,以便完成初始化对象的数据成员,最后返回这个动态对象的起始地址。员,最后返回这个动态对象的起始地址。用用new运算符产生的动态对象,在不再使用这种对象运算符产生的动态对象,在不再使用这种对象时,必须用

21、时,必须用delete运算符来释放对象所占用的存运算符来释放对象所占用的存储空间。储空间。用用new建立类的对象时,可以使用参数初始化动建立类的对象时,可以使用参数初始化动态空间。态空间。现在学习的是第24页,共50页class Afloat x,y;public:A(float a,float b)x=a;y=b;A()x=0;y=0;void Print(void)coutxtyPrint();pa2-Print();delete pa1;/用用delete释放空间释放空间 delete pa2;/用用delete释放空间释放空间现在学习的是第25页,共50页析构函数析构函数析构函数的作用

22、与构造函数正好相反,析构函数的作用与构造函数正好相反,是在对象的生命是在对象的生命期结束时,释放系统为对象所分配的空间,即要撤消一期结束时,释放系统为对象所分配的空间,即要撤消一个对象。个对象。析构函数也是类的成员函数,定义析构函数的格式为:析构函数也是类的成员函数,定义析构函数的格式为:ClassName:ClassName()./函数体函数体;现在学习的是第26页,共50页析构函数析构函数析构函数是析构函数是成员函数成员函数,函数体可写在类体内,也可写,函数体可写在类体内,也可写在类体外。在类体外。析构函数是一个特殊的成员函数,函数名必须与析构函数是一个特殊的成员函数,函数名必须与类名相同

23、,并在其类名相同,并在其前面加上字符前面加上字符“”,以便和构造,以便和构造函数名相区别函数名相区别。析构函数析构函数不能带有任何参数,不能有返回值,不指不能带有任何参数,不能有返回值,不指定函数类型。定函数类型。一个类中,只能定义一个析构函数,一个类中,只能定义一个析构函数,析构函数不析构函数不允许重载。允许重载。析构函数是在撤消对象时由系统自动调用的。析构函数是在撤消对象时由系统自动调用的。现在学习的是第27页,共50页class Afloat x,y;public:A(float a,float b)x=a;y=b;cout调用非缺省的构造函数调用非缺省的构造函数n;A()x=0;y=0

24、;cout调用缺省的构造函数调用缺省的构造函数n;A()cout调用析构函数调用析构函数n;void Print(void)coutxtyendl;void main(void)A a1;A a2(3.0,30.0);cout退出主函数退出主函数n;调用缺省的构造函数调用缺省的构造函数调用非缺省的构造函数调用非缺省的构造函数退出主函数退出主函数调用析构函数调用析构函数调用析构函数调用析构函数现在学习的是第28页,共50页缺省的析构函数缺省的析构函数若在类的定义中没有显式地定义析构函数若在类的定义中没有显式地定义析构函数时,则编译器自动地产生一个缺省的析构时,则编译器自动地产生一个缺省的析构函数

25、,其格式为:函数,其格式为:ClassName:ClassName();任何对象都必须有构造函数和析构函数,任何对象都必须有构造函数和析构函数,但在撤消对象时,但在撤消对象时,要释放对象的数据成员要释放对象的数据成员用用new运算符分配的动态空间时,必须运算符分配的动态空间时,必须显式地定义析构函数显式地定义析构函数。现在学习的是第29页,共50页拷贝函数拷贝函数拷贝函数是一种特殊的构造函数,它用于依据已拷贝函数是一种特殊的构造函数,它用于依据已存在的对象建立一个新对象,一般格式为:存在的对象建立一个新对象,一般格式为:ClassName:ClassName(ClassName&)./函数体完

26、成对应数据成员的赋值函数体完成对应数据成员的赋值 只有一个参数,是同类对象的引用。例:只有一个参数,是同类对象的引用。例:现在学习的是第30页,共50页class Afloat x,y;public:A(float a=0,float b=0)x=a;y=b;cout调用构造函数调用构造函数n;A(A&a)x=a.x;y=a.y;cout调用了拷贝函数调用了拷贝函数n;void Print(void)coutxtyendl;A()cout调用析构函数调用析构函数n;void main()A a1(1.0,2.0);A a2(a1);a1.Print();a2.Print();拷贝函数拷贝函数现

27、在学习的是第31页,共50页拷贝函数拷贝函数如果如果没有定义没有定义拷贝函数,编译器拷贝函数,编译器自动自动生成一个隐含生成一个隐含的拷贝函数。的拷贝函数。例:例:class Afloat x,y;public:A(float a=0,float b=0)x=a;y=b;cout调用构造函数调用构造函数n;void Print(void)coutxtyendl;A()cout调用析构函数调用析构函数n;void main(void)A a1(1.0,2.0);A a2(a1);A a3=a1;/可以这样赋值可以这样赋值 a1.Print();a2.Print();a3.Print();现在学习

28、的是第32页,共50页对象数组与对象指针对象数组与对象指针对象数组对象数组对象数组:数组中的每一个元素都是类的对象。声对象数组:数组中的每一个元素都是类的对象。声明一维对象数组的语法形式:明一维对象数组的语法形式:类名类名 数组名数组名常量表达式常量表达式;引用对象数组元素的公有成员:引用对象数组元素的公有成员:数组名数组名下标下标.成员名成员名;对象数组的初始化:调用构造函数对每个元素初对象数组的初始化:调用构造函数对每个元素初始化,也可以用初始化列表。见下例:始化,也可以用初始化列表。见下例:现在学习的是第33页,共50页对象数组对象数组#include#include class Stu

29、dentprivate:int number;char name10;int age;public:Student(int xh,char*xm,int a)number=xh;strcpy(name,xm);age=a;int GetAge()return age;int getnumber()return number;现在学习的是第34页,共50页对象数组对象数组void main()Student s5=Student(10001,AAAAAA,20),Student(10002,BBBBBB,22),Student(10003,CCCCCC,24),Student(10004,DDD

30、DDD,26),Student(10005,EEEEEE,28);for(int i=0;i5;i+)cout 学号学号:si.getnumber()年龄年龄:si.GetAge()成员名,见下例:成员名,见下例:现在学习的是第36页,共50页对象指针对象指针void main()Student*p3;p0=new Student(10001,AAAAAA,20);p1=new Student(10002,BBBBBB,22);p2=new Student(10003,CCCCCC,24);for(int i=0;i3;i+)cout 学号学号:getnumber()年龄年龄:GetAge()

31、endl;delete*p;现在学习的是第37页,共50页静态数据成员静态数据成员在类定义中,用关键字在类定义中,用关键字static修饰的数据成员称为静修饰的数据成员称为静态数据成员。态数据成员。将类的某一个将类的某一个数据成员的存储类型指定为静态类型数据成员的存储类型指定为静态类型时时,则由该类所产生的所有对象,其静态成员均共享,则由该类所产生的所有对象,其静态成员均共享一个存储空间一个存储空间,这个空间是在编译的时候分配的这个空间是在编译的时候分配的。class A int x,y;static int z;public:void Setxy(int a,int b)x=a;y=b;A

32、a1,a2;a1.xa1.ya2.xa2.yza1.za2.z不同对象,同一空间不同对象,同一空间现在学习的是第38页,共50页静态数据成员静态数据成员类的静态数据成员是类的静态数据成员是静态分配存储空间静态分配存储空间的,而其它的,而其它成员是动态分配存储空间的。成员是动态分配存储空间的。必须在文件作用域中,对静态数据成员作一次且只能作必须在文件作用域中,对静态数据成员作一次且只能作一次定义性说明,一次定义性说明,通过静态数据成员名前加上通过静态数据成员名前加上类名类名和作用域运算符和作用域运算符,可直接引用静态数据成员。,可直接引用静态数据成员。为了保持静态数据成员取值的一致性,通常在构为

33、了保持静态数据成员取值的一致性,通常在构造函数中不给静态数据成员置初值,造函数中不给静态数据成员置初值,而是在对静态而是在对静态数据成员的定义性说明时指定初值数据成员的定义性说明时指定初值。见下例:见下例:现在学习的是第39页,共50页class A int i,j;public:static int x;A(int a=0,int b=0,int c=0)i=a;j=b;x=c;void Show()cout i=itj=jt;cout x=xn;int A:x=500;/int A:xvoid main(void)A a(20,40,10),b(30,50,100);a.Show();b.

34、Show();cout A:x=A:xn;在类外重新定义在类外重新定义现在学习的是第40页,共50页静态成员函数静态成员函数可以将类的成员函数定义为静态的成员函数,即使用关键可以将类的成员函数定义为静态的成员函数,即使用关键字字static来修饰成员函数来修饰成员函数。在类外,通过类名加上作用域操作符,可直接调用静在类外,通过类名加上作用域操作符,可直接调用静态成员函数态成员函数。静态成员函数只能直接使用本类的静态数据成员或静态成静态成员函数只能直接使用本类的静态数据成员或静态成员函数员函数,但不能直接使用非静态的数据成员但不能直接使用非静态的数据成员。静态成员函数的实现部分在类定义之外定义时

35、,其前面不静态成员函数的实现部分在类定义之外定义时,其前面不能加修饰词能加修饰词static。静态成员函数也是在编译时分配存储空间,所以在静态成员函数也是在编译时分配存储空间,所以在程序的执行过程中不能提供多态性。见下例:程序的执行过程中不能提供多态性。见下例:现在学习的是第41页,共50页class Tc private:int A;static int B;/静态数据成员静态数据成员public:Tc(int a)A=a;B+=a;static void display(Tc c)/Tc的对象为形参的对象为形参 coutA=c.A,B=Bendl;int Tc:B=2;void main(

36、void)Tc a(2),b(4);Tc:display(a);Tc:display(b);非静态成员,用对象非静态成员,用对象名来引用名来引用静态成静态成员,直员,直接引用接引用直接用类名来调用静直接用类名来调用静态成员函数态成员函数现在学习的是第42页,共50页友元函数友元函数类中私有和保护的成员在类外不能被访问。类中私有和保护的成员在类外不能被访问。友元函数是一种定义在类外部的友元函数是一种定义在类外部的普通函数普通函数,其特点是,其特点是能够访问类中私有成员和保护成员能够访问类中私有成员和保护成员,即类的访问权限,即类的访问权限的限制对其不起作用。的限制对其不起作用。友元函数需要在友元

37、函数需要在类体内类体内进行说明,在前面加上关键字进行说明,在前面加上关键字friend。一般格式为:一般格式为:friend type FuncName(args)一个类的友元可以自由地用该类中的所有成员。一个类的友元可以自由地用该类中的所有成员。友元函数破坏了类的封装性和隐蔽性,使得非成员函数友元函数破坏了类的封装性和隐蔽性,使得非成员函数可以访问类的私有成员。见下例:可以访问类的私有成员。见下例:现在学习的是第43页,共50页class A float x,y;public:A(float a,float b)x=a;y=b;float Sum()return x+y;friend flo

38、at Sum(A&a)return a.x+a.y;void main()A t1(4,5),t2(10,20);coutt1.Sum()endl;coutSum(t2)endl;友元函数友元函数成员函数成员函数友元函数的调用,直接调用友元函数的调用,直接调用成员函数的调用,利用对象名调用成员函数的调用,利用对象名调用友元函数只能用友元函数只能用对象对象名名引用类中的数据。引用类中的数据。私有数据私有数据现在学习的是第44页,共50页友元函数说明友元函数说明友元函数不是类的成员函数。友元函数不是类的成员函数。必须将对象名或对象的引用作为友元函数必须将对象名或对象的引用作为友元函数的参数的参数,

39、这样才能访问到对象的成员。,这样才能访问到对象的成员。友元函数必须在类的定义中说明,友元函数必须在类的定义中说明,其函数其函数体可在类内定义,也可在类外定义;体可在类内定义,也可在类外定义;友元函数可以访问该类中的所有成员友元函数可以访问该类中的所有成员,而,而一般函数只能访问类中的公有成员。一般函数只能访问类中的公有成员。在类中对友元函数指定访问权限是不起作在类中对友元函数指定访问权限是不起作用的用的。现在学习的是第45页,共50页友元函数友元函数大多数情况是友元函数是某个类的成员函大多数情况是友元函数是某个类的成员函数,数,即即A类中的某个成员函数是类中的某个成员函数是B类中的类中的友元函

40、数,这个成员函数可以直接访问友元函数,这个成员函数可以直接访问B类中的私有数据。类中的私有数据。这就实现了类与类之间这就实现了类与类之间的沟通。的沟通。class A.void fun(B&);class B.friend void fun(B&);既是类既是类A的成员函数的成员函数又是类又是类B的友元函数的友元函数现在学习的是第46页,共50页class B ;/先定义类先定义类A,则首先对类,则首先对类B作引用性说明作引用性说明class A ./类类A的成员定义的成员定义public:void fun(B&);/函数的原型说明函数的原型说明 ;class B.friend void A:

41、fun(B&);/定义友元函数定义友元函数;void A:fun(B&b)/函数的完整定义函数的完整定义 ./函数体的定义函数体的定义类类A中的成员函数中的成员函数fun()是类是类B的友元函数。即的友元函数。即在在fun()中可以直接引中可以直接引用类用类B的私有成员。的私有成员。现在学习的是第47页,共50页友元类友元类class A .friend class B;class B .类类B是类是类A的友元的友元类类B可以自由使用类可以自由使用类A中的成员中的成员对于类对于类B而言,类而言,类A是透明的是透明的类类B必须通过必须通过类类A的对象的对象使用类使用类A的成员,见下的成员,见下例

42、:例:现在学习的是第48页,共50页const float PI=3.1415926;class A float r;float h;public:A(float a,float b)r=a;h=b;friend class B;/定义类定义类B为类为类A的友元的友元;class B int number;public:B(int n)number=n;void Show(A&a)coutPI*a.r*a.r*a.h*numberendl;void main(void)A a1(25,40),a2(10,40);B b1(2);b1.Show(a1);b1.Show(a2);直接引用类直接引用

43、类A的私有成员的私有成员类类B中的任何函数都能使中的任何函数都能使用类用类A中的所有私有成中的所有私有成员。员。现在学习的是第49页,共50页习题习题1.定义学生类,包括数据成员(学号、姓名、成绩)定义学生类,包括数据成员(学号、姓名、成绩)和成员函数(和成员函数(void input(int n,char*na,float s),void modify(float s),void display())要求成员函数在类外定义,主程序中定义对)要求成员函数在类外定义,主程序中定义对象并调用成员函数。象并调用成员函数。2.在类中定义一个私有数据成员,再说明友元函在类中定义一个私有数据成员,再说明友元函数用来输出私有数据成员的平方值。数用来输出私有数据成员的平方值。现在学习的是第50页,共50页

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

当前位置:首页 > 生活休闲 > 资格考试

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

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