《类的其他特性》PPT课件.ppt
《《类的其他特性》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《类的其他特性》PPT课件.ppt(30页珍藏版)》请在三一办公上搜索。
1、Visual C+程序设计,第12章 类的其他特性,12.1 友元函数12.2 虚函数12.3 静态成员,第12章 类的其他特性,12.1.1 友元函数的概念友元函数是在类体中定义或说明的外部函数,它不是类的成员函数,却能不受限制地访问类中所有访问权限的成员。12.1.2 友元函数的定义1.类中定义格式 friend 函数类型 函数名称(形参列表).2.类中说明,类外定义(1)类中说明格式 friend 函数类型 函数名称(形参列表);(2)类外定义格式 函数类型 函数名称(形参列表).,12.1 友元函数,友元函数在类外定义时,函数类型前不能加friend;函数名前没有“类名:”。,例12-
2、1 用友元函数求圆柱体的体积。const float PI=3.1415;class A float r,h;public:A(float a,float b);float getr()return r;friend float geth(A/D,12.1 友元函数,(1)A行能否改为:return h;(2)C行能否改为:couta1.volum(a1);(3)去掉B行,程序能否运行?(4)在不改变成员访问权限的前提下,若把D行改为:cout PI*a1.r*a1.r*a1.h;程序应作怎样的修改?,使用用友元函数时注意:友元函数不是成员函数,没有this指针,不能直接使用类的成员,必须通过
3、对象或指向对象的指针引用成员,使用格式为:对象.成员,或:指针-成员友元函数要使用对象必须通过参数(对象或指向对象的指针)传入对象。友元函数的调用不能通过对象调用,应该直接调用。友元函数的作用域不是类的作用域,其定义不受访问权限的限制。友元函数可提高程序的运行效率,但破坏了类的封装性,应谨慎使用。,12.1 友元函数,12.1.3 成员函数用作友元 友元函数一定不是本类的成员,但可以是另一个类的成员。例12-2 把一个类的成员函数作为另一个类的友元函数。class B;/对类B作引用性说明class A float x;public:A(float a)x=a;float getx()retu
4、rn x;void setx(B,12.1 友元函数,12.1.4 友元类 当把一个类(类B)说明为另一个类(类A)的友元时,则称类B是类A的友元类,此时类B的所有成员函数都是类B的友元函数。例12-3 把一个类作为另一个类的友元类。class A float a;friend class B;/说明类B是类A的友元 friend void main();/A A()a=100;class B float b;public:B(A*p)b=p-a*2;/B float get()return b;void main()A a1;B b1(,12.1 友元函数,(1)去掉A行,程序会出现什么错误
5、?(2)能否把主函数中的“b1.get()”改为“b1.b”?(3)B行为什么能在类B中能访问类A的私有成员a?(4)友元关系是不可传递的,也是不可逆的。,12.2.1 多态性与虚函数 1.多态性的概念多态性是指同样的消息(如函数的调用)被不同的对象接收时导致不同的行为。2.多态性的类型(1)编译时的多态性(静态多态性);(2)运行时的多态性(动态多态性)。3.静态多态性静态多态性主要通过函数的重载和运算符的重载来实现,它们在程序运行之前(编译时)就能确定其实现方式。,12.2 虚函数,例12-4 通过函数的重载实现编译时的多态性。#includeclass Aint a;public:A(i
6、nt n)a=n;void print(int i)couta+in;void print()coutan;void main()A t(10);t.print(1);/At.print();/B,12.2 虚函数,A行和B行虽然都是调用print函数,但参数不同,在编译时产生不同的代码,即在编译时就决定了不同的运行结果,这是编译的多态性。,3.动态多态性 动态多态性是同样的函数调用语句,编译产生的代码也是一样的,即不能在编译时决定程序的运行结果,而要等到程序运行时,根据不同类型的对象才能确定程序的具体执行情况。动态多态性要在具有继承关系的类中,通过虚函数、指向基类对象和派生类对象的基类指针来
7、实现。如:class A;public:virtual void print().;class B:public A;public:void print().;void main()A a1,*p;B b1;p=,12.2 虚函数,12.2.2 虚函数的概念 类中用关键字virtual说明的成员函数称为虚函数。虚函数的实现是不确定的,相同的调用形式要根据运行时不同的对象来确定。而函数的重载是根据调用形式确定的。虚函数具有遗传性。以含虚函数的类为基类的派生类中,相同原型(同名同参同类型)的成员函数均具有虚特性,而不管其是否用关键字“virtual”修饰。在派生类中重新定义与基类同名、同参、同类型
8、的虚函数,可以实现动态多态性。虚函数不能是静态成员函数,更不能是友元函数,只能是成员函数。可以将析构函数定义为虚函数,但不能将构造函数定义为虚函数。,12.2 虚函数,12.2.3 虚函数的定义(1)在类中定义格式virtual 函数类型 函数名称(形参列表)./函数体(2)在类中说明,类外定义 类中说明格式virtual 函数类型 函数名(形参列表);类外定义格式函数类型 类名:函数名(形参)./函数体虚函数在类体外定义时,不能在函数类型前再加virtual。,12.2 虚函数,例12-5 用虚函数实现动态多态性。class Apublic:virtual void f()/A coutf(
9、);p=,12.2 虚函数,运行结果:类A中的函数类B中的函数思考:(1)去掉A行的“virtual”,输出什么?(2)语句“b1.A:f();b1.f();”,输出什么?,p,例12-6 虚函数实现动态多态性的条件。class Apublic:virtual void f1(int a)coutf1(1);p-f2(3);p-f3(5);p-f4(7);p=,12.2 虚函数,p,1 3 5 7,2,3 5 7,基类的指针指向派生类对象时,原则上只能使用基类继承来的成员;但当继承来的成员是虚函数时,则使用派生类中新增的成员。,12.2.4 纯虚函数 1.纯虚函数的概念 纯虚函数是没有实现部分
10、(函数体)的虚函数,定义时将0赋值给函数名;可以实现动态多态性。2.定义格式 virtual 函数类型 函数名称(形参列表)=0;3.抽象类的概念 抽象类是指不能直接产生对象的类,主要有两种情况:(1)构造函数或析构函数为非公有访问权限的类;(2)含纯虚函数的类。因纯虚函数没有函数体(不同于空函数),所以含纯虚函数的类是不完整的类,不能产生对象,但可以定义该类的指针。,12.2 虚函数,例12-7 用纯虚函数求几何体体积(动态多态性),要求如下:(1)定义高为h的抽象几何体V保护数据成员:float h;公有成员函数:构造函数;纯虚函数void volum();(2)由V派生出底面半径为r的圆
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 类的其他特性 其他 特性 PPT 课件
链接地址:https://www.31ppt.com/p-5565939.html