




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十二章 类的其它特性,1、友元函数与友元类,友元给予别的类或非成员函数访问私有成员权利。 在此类中用关键字friend声明,公有或私有区声明都行。 友元函数的定义方法是在类的任何地方象定义其它函数一样定义该函数。,例 class person friend void display(person*); char *name; int age; public: person(char *str,int i) name=str; age=i; ; void display(person *a) coutnameageendl; ,在类外定义时不用加作用域运算符 “:”,也不用加关键字 friend,void main() person demo(“Frank”,30); display( /象调用普通函数一样 调用友元函数 ,在使用友元函数时,要注意以下几点: (1) 友元函数并不是相应类的成员函数,它没有隐含的*this指针,所以它不能象成员函数那样直接访问和修改类的成员。必须为友元函数定义相应类类型的参数或在函数体中定义相应类的对象,通过该参数或对象才能访问和修改相应类的成员。 (2) 友元函数必须在类的定义中说明。 (3) 友元函数不受类中访问权限的限制,可以把它放在类的私有部分、公有部分或保护部分,其作用都是一样的。 (4) 友元函数的作用域与成员函数不同。,另一类的成员作为友元: class x public: void f( ); private: int i; ; class y friend void x:f( ); int i; public: / ; void x:f( ) y yi; yi.i=10; ,整个类作为另一个类的友元: class x friend class y; / ;,y是x的友元类,y中所有的成员函数可以象友元函数一样访问x类中的所有成员 y是x的友元类,但x则不一定是y的友元类.既友元关系不具备交换性,除非两者互为定义 友元关系不具备传递性,也不能继承,2、多态性的概念,所谓的多态性就是当不同对象接受到相同消息时能产生不同的动作。 有两种类型的多态性: 静态多态性(编译时的多态):操作的对象编译时确定,通过函数名重载或运算符重载实现的多态。 动态多态性(运行时的多态性):操作的对象依赖运行的进程,在程序的运行过程中,根据具体的执行环境来动态地确定调用哪一个函数 。,在将公有派生类的对象赋给基类对象之后,基类对象只能访问派生类中从基类继承的公有成员,不能访问派生类中增加的公有成员。 那么如何让基类对象也能访问派生类中增加的公有成员呢? 由此C+引进了虚函数。 动态多态要通过虚函数来实现。,3、虚函数的定义与使用,定义虚函数的一般格式为: virtual 成员函数名(); 当基类的某个成员函数为虚函数时,它的所有派生类中与虚函数相同的函数都为虚函数,不管它们前面有没有冠以virtual。,【例】 引入虚函数的原因示例 class CStudent /本科生类 / public: virtual void Calctuition() /计算本科生学费 (虚函数的定义) cout“得到本科生学费计算结果!“endl; / ; class CGraduateStudent:public CStudent /研究生类 / public: void Calctuition() /计算研究生学费 cout“得到研究生学费计算结果!“endl; / ;,void main(void) CStudent s1,*p; CGraduateStudent s2; p= /D ,得到本科生学费计算结果!,得到研究生学费计算结果!,得到研究生学费计算结果!,如果Cstudent的Calctuition不声明为虚函数,则C行 应输出“得到本科生学费计算结果!“,当基类中的某个成员函数被定义为虚函数时,在其派生类中通常要对该函数重新定义。 虚函数的作用是:当编译器编译虚函数时,编译系统将用动态连接的方式进行编译。即在编译时不确定该虚函数的版本,而是用一种机制(虚函数表),在运行过程根据其所指向的实例决定使用哪一个函数版本。,ptr-Calctuition( ): 1、检查ptr所指对象类型; 2、根据对象类型查虚函数表,找出相应虚函数指针; 3、通过虚函数入口调用相应虚函数。,在使用虚函数时要注意以下几个问题: (1) 虚函数必须是类的一个成员函数,但不能是静态的成员函数,也不能是友元函数。 (2) 实现动态多态性的方法是:必须将基类指针或引用指向它的任一派生类,并通过该指针或引用调用虚函数。,在使用虚函数时要注意以下几个问题: (3)若虚函数为外联函数,则在外面定义 函数体时,在函数名前不要加virtual。 (4)通过域操作符“:”可以抑制虚函数调用。 如: p-Cstudent:Calctuition(); 则可强制输出Cstudent的Calctuition函数。 (5)虚函数是通过内部虚函数表机制来实现动态多态的。,4、虚函数和重载函数,一组虚函数中,两个虚函数仅返回值不同,参数和名字相同,编译错。 派生类虚函数的参数与基类虚函数参数不同,则不属于同一组虚函数,是重载关系。,class Number public: virtual void add(int a ) cout“int a”n; ; class BigNumber: public Number public: virtual void add(double a) cout“double a”n; ;,void main( ) BigNumber b0; Number *a= ,int a,int a,double a,double a,int a,5、虚析构函数,如果基类构造函数中调用虚函数,则它调用基类版本的虚函数 虚构造函数是没有意义的,因为虚函数只有和对象结合起来才能体现多态性。但虚拟析构函数是有意义的,而且经常使用。 利用虚析构函数的一般原则是:当将基类指针或引用用new运算符指向派生类实例时,为了在释放派生类实例时能调用派生类的析构函数,必须将基类的析构函数定义为虚函数。,class X private: char *p; public: X(int size) p=new charsize; virtual X( ) delete p; /虚析构函数 ; class Y :public X private: char *pp; public: Y(int sz1, int sz2): X(sz1) pp=new charsz2; Y( ) delete pp; /自动成为虚函数 ;,X *px=new Y(10,12); / delete px;,6、虚函数的数据封装,前面已经学过,类的私有成员只能被类的成员函数或友员函数所访问,其它函数无法访问类的私有成员。 对于虚函数,情况有所不同。虚函数是公有成员或私有成员取决于首次定义它的类中该函数是公有成员还是私有成员。,class A1 public: virtual void show() / 首次定义虚拟成员函数 coutshow(); ptr= ,class A2 show() is called,class A1 show() is called,7、纯虚函数和抽象类,基类中虚函数没定义,用初始化符=0代替函数定义,这时的虚函数叫纯虚函数。 class X / public: virtual void print( )=0; /纯虚函数,无实现部分 / ;,含有纯虚函数的类叫做抽象基类。 class Y :public X public: virtual void print( ) ; / ; X x1;(错误!) Y y1;,抽象类的作用是:在由该类派生出来的类体系中,它可对类体系中的任何一个子类提供一个统一的接口,即用相同的方法对该类体系中的任一子类实例进行各种操作,并可把接口和实现分开。 对于抽象类的使用有以下几点规定: (1) 抽象类只能用作其它类的基类,不能建立抽象类实例。 (2) 抽象类不能用作参数类型、函数返回类型或显式类型转换。 (3) 可以声明抽象类的指针或引用,此指针或引用可以指向它的派生类,进而实现多态性。,有关纯虚函数的定义和使用,须说明以下几点: (1) 定义纯虚函数时,不能定义其实现部分。因此在对纯虚函数重新定义之前不能调用该函数。 (2) 虚函数函数名赋值0并没有特别的含义,只是表明该虚函数为纯虚函数。 (3) 在定义具有纯虚函数的类(抽象类)的派生类时,必须对纯虚函数重新定义,否则该派生类还是抽象类,不能有自己的实例。 (4) 具有纯虚函数的抽象类的对象指针不能调用抽象类中的纯虚函数,但可以调用抽象类中的非纯虚函数。,【例】利用纯虚函数定义抽象类 class Cabs protected: int x; public: CAbs()x=1000; virtual void print()=0; /纯虚函数 void fun()cout“调用抽象类CAbs中的非纯虚函数“endl; ; class CB : public Cabs int y; public: CB()y=2000; void print()cout“y=”yn; /对基 类的纯虚函数重新定义 ;,class CC : public Cabs int z; public: CC()z=3000; void print()coutprint(); /错误,因为print()为纯虚函数,应去掉 pa-fun(); /调用抽象类中的非纯函数 CB b; pa=,class CTest public: static int count; / ; int CTest:count=0; / 由于这种静态类成员独立于任何类对象存在,用:定义,而无需引用类实例。,无论CTest创建多少个实例,count将严格只存放一个拷贝。,8、静态类成员,前面不需加关键字static,【例】静态成员数据的定义及应用 class Ccounter static int count; /定义静态成员数据 int objnumber; /表示对象编号 public: CCounter() count+; objnumber=count; void Show() cout“obj“objnumbert“count=“countn; ; int CCounter:count=0; /在类定义外声明静态 成员数据并初始化,void main() CCounter obj1; obj1.Show(); cout“-n“; CCounter obj2; obj1.Show(); obj2.Show(); cout“-n“; CCounter obj3; obj1.Show(); obj2.Show(); obj3.Show(); ,Obj1 count=1 - Obj1 count=2 Obj2 count=2 - Obj1 count=3 Obj2 count=3 Obj3 count=3,Static 成员和整个程序作业一样持久,但作用域仅限于此类。另外,其它访问也是受控的(公有、私有、保护的)。 对于公有静态成员,可以通过类名直接访问,格式为: : 在创建任何对象之前,类的静态成员数据已经存在并可以引用。,【例】 分析程序输出的结果 class A int i; static int x; public: static int y; A(int a,int b,int c) i=a, x=b, y=c; void print() cout“i=“it“x=“xt“y=“yendl; ; int A:x=0; int A:y=0;,void main() cout“y=“A:yendl; /B A a(11,22,33); a.print(); A b(100,200,300); a.print(); b.print(); A:y=400; /C b.print(); ,y=0 i=11 x=22 y=33 i=11 x=200 y=300 i=100 x=200 y=300 i=100 x=200 y=400,静态成员函数: class CTest public: static int getCount( ) / / ; void main( ) int count=CTest:getCount( ); / ,通过类名直接访问静态成员函数,静态成员函数是一种特殊的成员函数,它不属于特定的对象,因此不含有隐含的*this指针参数。它不能象普通成员函数那样直接访问对象中的非静态的成员(成员数据和成员函数),只能访问所在类的静态成员(成员数据和成员函数)、全局变量和常量、外部函数等。若要访问非静态成员,则必须借助于类的对象。,【例】 分析程序输出的结果 class CTest private: static int count; public: CTest() +count; CTest( ) -count; static int getCount( ) return count; ; int CTest:count=0;,void main( ) coutCTest:getCount( )“object existn”; CTest test1; CTest *ptest2=new CTest
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 沈阳市重点中学2026届高一化学第一学期期中统考试题含解析
- 职场挑战与机遇:新面试题目解析
- 肾上腺区肿瘤影像学鉴别
- 三甲医院经营分析工作汇报
- 2026届辽宁省抚顺中学化学高二上期末检测模拟试题含答案
- 碳纤维制造工艺详解
- 鸟配色方案汇报
- 细胞无菌操作规范
- 童年小说情节讲解
- 2026届江苏省镇江市重点名校化学高二第一学期期末监测模拟试题含答案
- 高空作业车安全知识培训
- 电影美术课程设计
- 修脚服务行业未来三年发展洞察及预测分析报告
- 2024年京津冀公民科学素质大赛参考试题库(含答案)
- 吉林大学《计算机网络(双语)》2021-2022学年期末试卷
- 水果收货标准
- 急诊专科护士进修汇报课件
- 孩子成长档案模板
- 南京大学介绍
- 【视频号运营】视频号运营108招
- SYT 7328-2021 驱油用石油磺酸盐-PDF解密
评论
0/150
提交评论