第十二章静态友元_第1页
第十二章静态友元_第2页
第十二章静态友元_第3页
第十二章静态友元_第4页
第十二章静态友元_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 12.1 静态数据静态数据第十二章第十二章 目目 录录 12.3 友元友元 12.2 静态成员函数静态成员函数第十二章小结第十二章小结 全局对象是实现数据共享的一种方法,由于它处处可见,全局对象是实现数据共享的一种方法,由于它处处可见,因此不够安全,应尽量在程序中少用全局对象。因此不够安全,应尽量在程序中少用全局对象。 实现类的多个对象之间的数据共享,可使用静态成员。实现类的多个对象之间的数据共享,可使用静态成员。 静态成员包括静态数据成员和静态成员函数。静态成员包括静态数据成员和静态成员函数。 友元函数也是一种普通的友元函数也是一种普通的C+ 函数,但是它可以访问类函数,但是它可以访问类的

2、保护或私有成员,方便编程,提高了效率,同时也破坏了的保护或私有成员,方便编程,提高了效率,同时也破坏了类的封装性。类的封装性。 本章内容:本章内容:介绍如何使用静态数据成员和静态成员函数,介绍如何使用静态数据成员和静态成员函数,了解友元的使用方法及作用的局限性。了解友元的使用方法及作用的局限性。第十二章第十二章 静态成员与友元静态成员与友元 A variable that is part of a class, yet is not part of an object of that class, is called a static member. There is exactly one

3、copy of a static member instead of one copy per object, as for ordinary non-static members.12.1 静态数据静态数据 在一个类中,若将一个数据说明为在一个类中,若将一个数据说明为static,则该数据称为静,则该数据称为静态数据,它告诉编译器无论建立多少个该类的对象,都只有一态数据,它告诉编译器无论建立多少个该类的对象,都只有一个静态数据的拷贝,这个拷贝被所有类对象共享。个静态数据的拷贝,这个拷贝被所有类对象共享。 静态数据属于类而共享,不属于对象独有。它的值对每个静态数据属于类而共享,不属于对象独有。

4、它的值对每个对象都是一样的。对象都是一样的。 对静态数据成员的值的更新,即是对所有对象的该静态数对静态数据成员的值的更新,即是对所有对象的该静态数据成员值的更新。据成员值的更新。 静态数据使用关键字静态数据使用关键字static,静态数据成员在类体中说明,静态数据成员在类体中说明,在类体外定义,以分配存储空间并初始化。在类体外定义,以分配存储空间并初始化。例如:例如:下面例子说明了静态数据的说明和初始化方法。下面例子说明了静态数据的说明和初始化方法。#include #include class counter static int count; /在类体内说明静态数据在类体内说明静态数据 p

5、ublic: void setcount(int i) count=i; void showcount() coutcount; int counter:count=0; /在类体外定义静态数据在类体外定义静态数据void main() counter a,b; a.showcount(); b.showcount(); a.setcount(10); a.showcount(); b.showcount();结果:结果:0 0 10 10 从例子中可见,定义静态数据成员时,可根据需要说明其从例子中可见,定义静态数据成员时,可根据需要说明其访问权限控制符。访问权限控制符。 静态数据成员的生命期

6、是全局的,编译器只对它进行一次静态数据成员的生命期是全局的,编译器只对它进行一次初始化,将始终保持其值,直到下次改变为止。初始化,将始终保持其值,直到下次改变为止。例如:例如:下面程序说明了静态数据成员的定义、初始化和使用的下面程序说明了静态数据成员的定义、初始化和使用的方法。方法。#include class Myclass public: Myclass(int a,int b,int c); void getnumber( ); int getsum(Myclass m); private: int A,B,C; static int sum;int Myclass:sum(0);Myc

7、lass:Myclass(int a,int b,int c) A=a; B=b; C=c; sum+=A+B+C;void Myclass:getnumber(); coutA“;”B“;”Cendl;int Myclass:getsum(Myclass m) return Myclass:sum;void main() Myclass M(3,4,5),N(5,6,7); N.getnumber(); coutM.getsum(M)“;”M.getsum(N)endl;结果:结果:5; 6; 730; 30注意:注意:在成员函数在成员函数getsum()中,通过类来使用静态数据成员中,通过

8、类来使用静态数据成员sum,如:如:return Myclass:sum;也可以通过对象来使用也可以通过对象来使用sum,如:,如:return m.sum; 下图形象地说明了一个类下图形象地说明了一个类Group 的四个对象的存储分配情的四个对象的存储分配情况,每个对象具有自己的字符变量况,每个对象具有自己的字符变量ch 的拷贝内存空间,而共享的拷贝内存空间,而共享静态型变量静态型变量s,即静态变量,即静态变量s 在存储上只需拷贝一处就可以供所在存储上只需拷贝一处就可以供所有对象使用。有对象使用。class Group char ch; static int s;Group c char c

9、h; Group b char ch;Group d char ch;Group a char ch;static int s;静态数据成员可应用在以下几个方面:静态数据成员可应用在以下几个方面: 用来保存流动变化的对象个数用来保存流动变化的对象个数(如学生人数如学生人数);(2) 作为一个标志,指示一个特定的动作是否发生;作为一个标志,指示一个特定的动作是否发生;(1) (3) 指向一个链表的第一成员或最后一个成员的指指向一个链表的第一成员或最后一个成员的指针。针。12.1 静态成员函数静态成员函数(Static member function) A function that needs

10、access to members of a class, yet does not need to be invoked for a particular object, is called a static member function. 静态成员函数的说明和定义与静态数据成员一样,函数实静态成员函数的说明和定义与静态数据成员一样,函数实现可在类体内,也可在类体外,与一般成员函数相同。现可在类体内,也可在类体外,与一般成员函数相同。 在静态成员函数的实现中,可以直接使用静态成员,可以在静态成员函数的实现中,可以直接使用静态成员,可以通过对象来使用非静态成员。通过对象来使用非静态成员。对静

11、态成员函数的访问,在程序中可使用如下方式:对静态成员函数的访问,在程序中可使用如下方式: :()或或 .()静态成员函数只属于一个类,而不属于类中的任何对象。静态成员函数只属于一个类,而不属于类中的任何对象。例如:例如:下面是定义和使用静态成员函数的例子下面是定义和使用静态成员函数的例子#include class M public: M(int a) A=a; B+=a; static void fun(M m); /说明静态成员函数说明静态成员函数 private: int A; static int B;void M:fun(M m) /定义静态成员函数定义静态成员函数 cout“A=”

12、m.A“,”; /通过对象访问非静态变量通过对象访问非静态变量 cout“B=”Bendl; /直接访问静态变量直接访问静态变量int M:B=10; /定义并初始化静态变量定义并初始化静态变量void main() M P(6),q(8); M:fun(P); /类名调用类名调用 q.fun(q); /对象调用对象调用结果:结果:A=6,B=24A=8,B=24例如:例如:下面是另一个程序例子下面是另一个程序例子#include enum access_t shared, in_used, locked, unlocked;class access public: static void s

13、et_access(access_t a) acs=a; static access_t get_access() return(acs); private: static access_t acs;access_t access:acs=0;void main() access obj1,obj2; obj1.set_access(unlocked); if(obj2.get_access()=unlocked) obj2.set_access(in_used); cout“access resourcen”; else cout“locked outn”;输出为:输出为:access re

14、source 注意:注意:静态成员函数与非静态成员函数的根本区别在于静静态成员函数与非静态成员函数的根本区别在于静态成员函数没有态成员函数没有this 指针,而非静态成员函数有一个隐含的指指针,而非静态成员函数有一个隐含的指向当前对象的向当前对象的this 指针。指针。 例如:例如:该例说明一个静态成员函数与任何当前对象都无联该例说明一个静态成员函数与任何当前对象都无联系的原因系的原因class Sc public: void nsfn(int a); /类似于类似于Sc:nsfn(Sc *this, int a); static void sfn(int a); /无无this 指针指针 /

15、void fc(Sc& s) s.nsfn(10); /转换为转换为Sc:nsfn(&s,10); s.sfn(10); /转变为转变为Sc:sfn(10); 例例:Class Studentpublic: Student( ) computerscore=0; Student(float score) computerscore=score; totalscore+=score; count+; static float totalsum( ) return totalscore; static float average( ) void main( ) Student sd1(92),sd

16、2(85),sd3(80); return totalscore/count; coutsd1.totalsum( )endl; coutsd2.average( )endl; private: coutsd3.average( )i=a;void X:member_func(int a) /member function definition i=a;例如:例如:下面程序说明了友元函数的说明、定义和调用方法。程下面程序说明了友元函数的说明、定义和调用方法。程序功能是求两点间的距离序功能是求两点间的距离#include #include class Point public: Point(do

17、uble i, double j) x=i; y=j; void Getxy() cout“(”x“,”y“)”endl; friend double Distance(Point a, Point b); /友元函数的说明友元函数的说明 private: double x,y;Double Distance(Point a, Point b) /友元函数的定义友元函数的定义 double dx=a.x-b.x; double dy=a.y-b.y; return sqrt(dx*dx+dy*dy);void main() double d11=3.0,d12=4.0,d21=6.0,d22=

18、8.0; Point P1(d11,d12),P2(d21,d22); P1.getxy(); P2.getxy(); double d=Distance(P1,P2); /友元函数调用友元函数调用 cout“Distance is ”dendl;结果:结果:(3,4)(6,8)Distance is 5二、友元类二、友元类 当说明一个类为另一个类的友元时,友元类中的所有成员当说明一个类为另一个类的友元时,友元类中的所有成员函数都是另一个类的友元函数。函数都是另一个类的友元函数。例如:例如:下面程序说明友元类的应用,并分析程序输出结果下面程序说明友元类的应用,并分析程序输出结果#include class X public: friend class Y; /类类Y 是类是类X 的友元类的友元类 void set(int i) x=i; void display() cout“x=”x“,”“y=”yendl; private: int x; static int y; /静态数据说明静态数据说明;class Y public: Y(int i,int j); voi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论