欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    《类的其他特性》PPT课件.ppt

    • 资源ID:5565939       资源大小:211KB        全文页数:30页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《类的其他特性》PPT课件.ppt

    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-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指针,不能直接使用类的成员,必须通过对象或指向对象的指针引用成员,使用格式为:对象.成员,或:指针-成员友元函数要使用对象必须通过参数(对象或指向对象的指针)传入对象。友元函数的调用不能通过对象调用,应该直接调用。友元函数的作用域不是类的作用域,其定义不受访问权限的限制。友元函数可提高程序的运行效率,但破坏了类的封装性,应谨慎使用。,12.1 友元函数,12.1.3 成员函数用作友元 友元函数一定不是本类的成员,但可以是另一个类的成员。例12-2 把一个类的成员函数作为另一个类的友元函数。class B;/对类B作引用性说明class A float x;public:A(float a)x=a;float getx()return 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行,程序会出现什么错误?(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(int 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.动态多态性 动态多态性是同样的函数调用语句,编译产生的代码也是一样的,即不能在编译时决定程序的运行结果,而要等到程序运行时,根据不同类型的对象才能确定程序的具体执行情况。动态多态性要在具有继承关系的类中,通过虚函数、指向基类对象和派生类对象的基类指针来实现。如: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”修饰。在派生类中重新定义与基类同名、同参、同类型的虚函数,可以实现动态多态性。虚函数不能是静态成员函数,更不能是友元函数,只能是成员函数。可以将析构函数定义为虚函数,但不能将构造函数定义为虚函数。,12.2 虚函数,12.2.3 虚函数的定义(1)在类中定义格式virtual 函数类型 函数名称(形参列表)./函数体(2)在类中说明,类外定义 类中说明格式virtual 函数类型 函数名(形参列表);类外定义格式函数类型 类名:函数名(形参)./函数体虚函数在类体外定义时,不能在函数类型前再加virtual。,12.2 虚函数,例12-5 用虚函数实现动态多态性。class Apublic:virtual void f()/A coutf();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.纯虚函数的概念 纯虚函数是没有实现部分(函数体)的虚函数,定义时将0赋值给函数名;可以实现动态多态性。2.定义格式 virtual 函数类型 函数名称(形参列表)=0;3.抽象类的概念 抽象类是指不能直接产生对象的类,主要有两种情况:(1)构造函数或析构函数为非公有访问权限的类;(2)含纯虚函数的类。因纯虚函数没有函数体(不同于空函数),所以含纯虚函数的类是不完整的类,不能产生对象,但可以定义该类的指针。,12.2 虚函数,例12-7 用纯虚函数求几何体体积(动态多态性),要求如下:(1)定义高为h的抽象几何体V保护数据成员:float h;公有成员函数:构造函数;纯虚函数void volum();(2)由V派生出底面半径为r的圆柱体V1保护数据成员:float r;公有成员函数:构造函数;void volum():求圆柱体体积,并输出高、底面半径和体积;(3)由V1派生出底面边长为r、a的长方体V2私有数据成员:float a;公有成员函数:构造函数;void volum():求长方体体积,并输出高、底面边长和体积;(4)在主函数中测试定义的类。,12.2 虚函数,(1)能否去掉V中的纯虚函数?(2)能否把它定义为普通的虚函数?,(3)为什么V、V1中数据成员为保护权限?,12.3.1 静态数据成员 通常,各个对象的数据成员之间相互独立。但如果将一个类的某个数据成员说明为静态成员时,则该类所有对象的同一个静态成员均共享同一个内存空间。换言之,系统给类的静态成员分配统一的存储空间(为类所有),而给对象的非静态成员分配各自独立的存储空间(为对象所有)。class A int x;static int y;int A:y=10;A a1(1,2),a2(3,4),a3(5,6);,12.3 静态成员,2,4,6,将类的成员数据说明为静态时,必须在类中对其作引用性说明,同时在类外对其作定义性说明。(1)类中说明格式 static 数据类型 成员名;(2)类外定义格式 数据类型 类名:成员名;类中说明时要加static;类外定义时不能再加static,但名称前要加“类名:”;类中说明时不能初始化;类外定义时可以初始化,若不初始化,具有缺省值0;静态成员的引用方法:(1)类名:变量名(2)对象名.变量名,12.3 静态成员,例12-8 静态数据成员的说明与使用。class A public:static int a,b;/引用性说明 int c;A(int x,int y,int z)a=x;b=y;c=z;int A:a,A:b=5;/定义性说明,初始化void main()coutA:atA:bn;/A A a1(1,2,3);couta1.ata1.b;A a2(4,5,6);couta2.ata2.b ta2.c n;couta1.ata1.b ta1.c n;,12.3 静态成员,运行结果:05123456453,能否把程序中的a1.a、a1.b、a1.c分别改为:A:a、A:b、A:c;?,12.3.2 静态成员函数类的成员函数也可以说明为静态的。但不能把静态成员函数定义为虚函数。静态成员函数可以在类体中定义,也可以在类体中说明,类体外定义(1)类中说明格式 static 函数类型 函数名(形参列表);(2)类外说明格式 函数类型 类名:函数名(形参列表).类的静态成员函数不属于某个特定的对象,没有this指针。所以,静态成员函数只能直接使用静态成员(成员名),而使用非静态的成员,必须指明其所属的对象(对象名.成员名或指针-成员名),此时应通过对象类型的参数传入要操作的对象。类外使用静态成员函数方法:“类名:函数名”或“对象名.函数名”。,12.3 静态成员,例12-9 静态成员函数的定义与使用。class A int a;static int c;public:A(int x=0)a=x;c+;couta,建立对象cn;static void show(A,12.3 静态成员,运行结果:10,建立对象120,建立对象220,20,建立对象30,建立对象40,撤消对象40,撤消对象310,220,撤消对象210,撤消对象1,(1)show函数中的r.a能否改为a或A:a?c能否改为r.c或A:c?(2)a1.show(a2)与a2.show(a1)有何区别?,一、选择题1、下面关于类的成员函数与友元函数的叙述正确的是。A、都可以直接访问所有权限的成员B、在访问成员时都必须用“.”指明成员所属的对象C、在类外定义时都必须用“:”指明函数所属的对象D、成员函数必须定义在类中,友元函数必须定义在类外2、下列叙述中不正确的是。A、虚函数一定是成员函数B、虚函数一定是非静态的成员函数C、构造函数可以定义为虚函数D、析构函数可以定义为虚函数 3、下面关于纯虚函数的叙述不正确的是。A、不能定义纯虚函数的函数体B、纯虚函数不能实现运行的多态性C、含纯虚函数的类不能产生对象,只能作为基类D、可以定义指向含有纯虚函数的类的指针,课堂练习,4、设有如下类的定义:class Apublic:virtual void f();class B:public Apublic:void f();下列叙述中正确的是。A、A:f()和B:f()都是虚函数B、A:f()和B:f()都不是虚函数C、A:f()是虚函数,B:f()不是虚函数D、A:f()不是虚函数,B:f()是虚函数5、下面关于虚函数的叙述正确的是。A、虚函数必须是类的成员函数B、类的成员函数都可以说明为虚函数C、含有纯虚函数的类不能产生对象,因为它是虚基类D、只要说明了含虚函数的类,就能实现运行的多态性6、虚函数可以是。A、友元函数 B、析构函数C、构造函数 D、静态函数,课堂练习,7、下面程序段的执行结果是。class A public:virtual void fun1()coutfun1();a-fun2();a=A、B:fun1 B:fun2 C:fun1 C:fun2B、B:fun1 A:fun2 C:fun1 C:fun2C、B:fun1 A:fun2 C:fun1 A:fun2D、A:fun1 B:fun2 B:fun1 A:fun2,课堂练习,二、填空题1、VC+中,多态性有两种类型,函数的重载属于 多态性,虚函数通常用来实现 多态性。2、含纯虚函数的类不能产生对象,只能作为基类,因此它属于 类。3、类中的 数据成员共享存储空间。4、静态成员函数中,可以直接使用类的 成员;而使用 成员时,必须指明成员所属的对象。5、类外使用静态成员有两种形式:(1);(2)。6、能像成员函数一样,直接访问类中所有权限的成员的外部函数是类的 函数。,课堂练习,7、下面程序段的执行结果是。#define PI 3.1415927class A protected:static double x,y;public:A(int a=0)x=a;y=x/180*PI;virtual void f()coutf();B b1(60);p=,课堂练习,8、下面程序段的执行结果是。class A protected:int x;public:A()x=100;virtual void print()coutprint();p1=,课堂练习,9、下面程序段的执行结果是。class emploee protected:int number;char name10;float wage;public:emploee(int nu,char*na)number=nu;strcpy(name,na);virtual void paid()=0;void print()coutname编号number,月薪wage元n;class manager:public emploeepublic:manager(int nu,char*na):emploee(nu,na)void paid()wage=8000;class seller:public emploee float sales;public:seller(int nu,char*na,float s):emploee(nu,na)sales=s;void paid()wage=sales*4/100;void main()manager m(1001,Obama);m.paid();m.print();seller s(3003,Bush,100000);s.paid();s.print();,课堂练习,10、下列程序段的运行结果是。class A public:virtual void f()coutf();B*pb=,课堂练习,P.300:2.3.6.,作业,

    注意事项

    本文(《类的其他特性》PPT课件.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开