C程序设计基础第3章静态成员与友元

上传人:pu****.1 文档编号:591123157 上传时间:2024-09-16 格式:PPT 页数:33 大小:103KB
返回 下载 相关 举报
C程序设计基础第3章静态成员与友元_第1页
第1页 / 共33页
C程序设计基础第3章静态成员与友元_第2页
第2页 / 共33页
C程序设计基础第3章静态成员与友元_第3页
第3页 / 共33页
C程序设计基础第3章静态成员与友元_第4页
第4页 / 共33页
C程序设计基础第3章静态成员与友元_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《C程序设计基础第3章静态成员与友元》由会员分享,可在线阅读,更多相关《C程序设计基础第3章静态成员与友元(33页珍藏版)》请在金锄头文库上搜索。

1、第第3章章 静态成员与友元静态成员与友元 1.学习目标学习目标 熟练掌握C+中静态数据成员的声明、定义及使用掌握C+中静态成员函数的定义及使用熟练掌握C+中普通函数作为友元函数的使用掌握C+中成员函数作为友元的使用掌握C+中类作为友元的使用 2.3.1 静态成员静态成员 3.1.1 静态数据成员静态数据成员 3.1.2 静态成员函数静态成员函数3.1.3 静态成员使用静态成员使用 3.3.1.1 静态数据成员静态数据成员静静态态数数据据成成员员是是类类数数据据成成员员的的一一种种特特例例。每每个个类类只只为为静静态态数数据据成成员员分分配配一一个个存存储储空空间间,它它由由该该类类的的所所有有

2、对对象象共共同同拥拥有有,从从而而实实现现了了同同一一个个类的不同对象之间的数据共享。类的不同对象之间的数据共享。静静态态数数据据成成员员具具有有静静态态生生存存期期,在在程程序序运运行行时时就存在,直到程序运行结束。就存在,直到程序运行结束。4.3.1.1 静态数据成员静态数据成员静静态态数数据据成成员员的的声声明明,是是在在数数据据成成员员前前面面加加关关键字键字static static 。类类的的静静态态数数据据成成员员在在使使用用前前必必须须进进行行初初始始化化,并且一定要在类外完成。其初始化的形式如下:并且一定要在类外完成。其初始化的形式如下: :=; 例如:例如: int Wor

3、ker: total=0; int Worker: total=0; 5.3.1.1 静态数据成员静态数据成员静静态态数数据据成成员员属属于于类类,而而不不属属于于任任何何一一个个对对象象,所所以以,在在类类外外只只能能通通过过类类名名对对它它进进行行引引用用。静静态数据成员引用的一般形式如下:态数据成员引用的一般形式如下::;6.3.1.1 静态数据成员静态数据成员注意:注意:静静态态数数据据成成员员同同一一般般数数据据成成员员一一样样有有访访问问控控制制限限制。制。当当静静态态数数据据成成员员被被声声明明为为私私有有成成员员时时,只只能能在在类类内直接引用它,在类外无法引用。内直接引用它,

4、在类外无法引用。当当静静态态数数据据成成员员被被声声明明为为公公有有成成员员或或保保护护成成员员时时,可以在类外通过类名对它进行引用。可以在类外通过类名对它进行引用。 7.3.1.1 静态数据成员静态数据成员例例3.1 3.1 使用静态数据成员,统计工人的每周工作时间。使用静态数据成员,统计工人的每周工作时间。#include #include class Workerclass Workerprivate:private:char *name;char *name;int worktime;int worktime;public:public:static int total; /stati

5、c int total; /用于统计总工作时间用于统计总工作时间void workTime(int n);void workTime(int n);void Worker: workTime(int n)void Worker: workTime(int n)worktime=n;worktime=n;total+=n;total+=n; 8.3.1.1 静态数据成员静态数据成员intWorker:total=0;/静静态态数据成数据成员员初始化初始化voidmain()Workerworker1,worker2,worker3;worker1.workTime(48);worker2.wor

6、kTime(36);worker3.workTime(38);coutTotal=Worker:totalendl;9.3.1.2 静态成员函数静态成员函数静静态态成成员员函函数数与与静静态态数数据据成成员员一一样样,它它们们都都属属于整个类,不与类的任何对象相联系。于整个类,不与类的任何对象相联系。静静态态成成员员函函数数的的声声明明,是是在在成成员员函函数数的的类类型型说说明符前加明符前加static关键字。关键字。由由于于静静态态成成员员函函数数与与类类相相联联系系,所所以以访访问问静静态态函函数数时时,不不需需要要使使用用对对象象。引引用用静静态态成成员员函函数数的一般格式:的一般格式

7、::()10.3.1.2 静态成员函数静态成员函数可可以以使使用用对对象象去去引引用用静静态态成成员员函函数数。用用这这两两种种方方法法调调用用静静态态成成员员函函数数都都是是允允许许的的,而而且且意意义义相同。相同。 静静态态成成员员函函数数可可以以直直接接引引用用该该类类的的静静态态数数据据成成员员和和成成员员函函数数,而而不不能能直直接接引引用用非非静静态态数数据据成成员员,如如果果要要引引用用,必必须须通通过过参参数数传传递递的的方方式式得得到对象名,然后再通过对象名来引用。到对象名,然后再通过对象名来引用。 11.3.1.2 静态成员函数静态成员函数例例3.2 3.2 用两种方法调用

8、静态成员函数。用两种方法调用静态成员函数。#include #include class Personclass Personprivate:private:char name20;char name20;static int ID;static int ID;public:public:static int number();static int number();int Person:number()int Person:number()return ID;return ID; 12.3.1.2 静态成员函数静态成员函数intPerson:ID=1001;voidmain()Personp

9、1;cout类类名引用:名引用:Person:number()endl;cout对对象引用:象引用:p1.number()endl;13.3.1.2 静态成员函数静态成员函数例例3.3 3.3 静态成员函数间接访问非静态数据成员。静态成员函数间接访问非静态数据成员。 #include #include class Myclassclass Myclassprivate:private:int m; /int m; /非静态数据成员非静态数据成员static int n; /static int n; /静态数据成员静态数据成员public:public:Myclass(); /Myclass(

10、); /构造函数构造函数static int getn(Myclass a);static int getn(Myclass a);Myclass: Myclass()Myclass: Myclass()m=10;m=10; 14.3.1.2 静态成员函数静态成员函数intMyclass:getn(Myclassa)couta.mendl;/通通过类间过类间接使用非静接使用非静态态数据成数据成员员returnn;intMyclass:n=100;/静静态态数据成数据成员员初始化初始化voidmain()Myclassapp1;coutapp1.getn(app1)endl;/利用利用对对象引用

11、静象引用静态态函数成函数成员员coutMyclass:getn(app1)endl;/利用利用类类名引用静名引用静态态函数成函数成员员15.3.1.3 静态成员使用静态成员使用例例3.4 3.4 静态成员的使用。静态成员的使用。#include #include #include #include class staffclass staffprivate:private:char name30;char name30;int age;int age;char sex;char sex;static staff *pFirst; /static staff *pFirst; /私有静态数据成员

12、私有静态数据成员staff *pNext;staff *pNext;public:public:static int count;static int count;staff(char *n,int a,char s); /staff(char *n,int a,char s); /构造函数构造函数staff() ;staff() ;static staff *findname(char *pname);static staff *findname(char *pname);void display();void display();16.3.1.3 静态成员使用静态成员使用staff:sta

13、ff(char*n,inta,chars)/构造函数构造函数strcpy(name,n);age=a;sex=s;pNext=pFirst;pFirst=this;count+;17.3.1.3 静态成员使用静态成员使用staff:staff()/析构函数析构函数staff*ps;if(pFirst=this)pFirst=pNext;return;for(ps=pFirst;ps;ps-pNext)if(ps-pNext=this)ps-pNext=pNext;return;18.3.1.3 静态成员使用静态成员使用staff*staff:findname(char*pname)staff*

14、ps;for(ps=pFirst;ps;ps-pNext)if(strcmp(ps-name,pname)=0)returnps;return(staff*)0;voidstaff:display()coutName:namet;coutAge:agett;coutSex:sexendl;19.3.1.3 静态成员使用静态成员使用staff*staff:pFirst=0;/静静态态数据成数据成员员初始化初始化intstaff:count=0;/静静态态数据成数据成员员初始化初始化voidmain()charstrname20;staffs1(Rose,19,F);staffs2(Jenny,1

15、9,F);staffs3(John,22,M);coutTotalemployees:staff:countendl;coutInputsearchname:strname;staff*ps=staff:findname(strname);/Johnif(ps)ps-display();elsecoutNofind!endl;20.3.2 友元友元 3.2.1 友元函数友元函数 3.2.2 友元类友元类 3.2.3 友元的使用友元的使用 21.3.2.1 友元函数友元函数如如果果友友元元是是普普通通函函数数或或类类的的成成员员函函数数,则则称称为为友友元元函函数数。友友元元函函数数是是在在类类

16、声声明明中中由由关关键键字字friend修饰的非成员函数。修饰的非成员函数。普通函数声明为友元函数的一般格式如下:普通函数声明为友元函数的一般格式如下:friend (参数表参数表);成员函数声明为友元函数的一般格式如下:成员函数声明为友元函数的一般格式如下:friend :(参数表参数表);22.3.2.1 友元函数友元函数说明:说明:友友元元函函数数为为非非成成员员函函数数,在在类类中中进进行行说说明明,一一般般在在类类外外进进行行定定义义,定定义义时时前前面面不不加加类类名名。如如果果是普通函数作为友元,也可以放在类体中定义。是普通函数作为友元,也可以放在类体中定义。友友元元函函数数的的

17、声声明明,可可以以放放在在类类声声明明中中的的任任何何位位置置,既既可可在在public区区,也也可可在在protected区区,意意义义完完全一样。全一样。友友元元函函数数可可以以通通过过对对象象名名访访问问类类的的所所有有成成员员,包包括私有成员和保护成员。括私有成员和保护成员。 23.3.2.1 友元函数友元函数例例3.53.5 普通函数作友元函数。普通函数作友元函数。#include #include #include #include const double PI=3.141593;const double PI=3.141593;class Circleclass Circlep

18、rivate:private:double x,y,r;double x,y,r;public:public:Circle(double xx=0,double yy=0,double rr=0) Circle(double xx=0,double yy=0,double rr=0) x=xx;x=xx;y=yy;y=yy;r=rr;r=rr; void display( ); void display( ); double area()return PI*r*r;double area()return PI*r*r;double circular()return 2*PI*r;double

19、circular()return 2*PI*r;friend double distance (Circle &p1,Circle &p2);friend double distance (Circle &p1,Circle &p2); /普普通通函函数数作作CircleCircle的友元的友元; 24.3.2.1 友元函数友元函数voidCircle:display()couttCenterpoint:(x,y)endl;couttRadius:rendl;couttArea:area()endl;couttCirculars:circular()endl;doubledistance(Ci

20、rcle&p1,Circle&p2)return(sqrt(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);25.3.2.1 友元函数友元函数voidmain()Circlec1(1,1,1),c2(3,4,5);coutCircle1:endl;c1.display();coutCircle2:endl;c2.display();coutThedistanceis:distance(c1,c2)endl;26.3.2.2 友元类友元类如如果果友友元元是是一一个个类类,则则称称为为友友元元类类。友友元元类类的的声明形式如下:声明形式如下:frien

21、d class 说明:说明:友元类的声明同样可以在类声明中的任何位置。友元类的声明同样可以在类声明中的任何位置。友元类的所有成员函数都成为友元函数。友元类的所有成员函数都成为友元函数。例例如如,若若A类类为为B类类的的友友元元类类,则则A类类的的所所有有成成员员函函数数都都是是B类类的的友友元元函函数数,都都可可以以访访问问B类类的的私有和保护成员。私有和保护成员。27.3.2.2 友元类友元类例例3.6 3.6 友元类的使用。友元类的使用。#include #include class B;class B;class Aclass A int i;int i;public:public: i

22、nt set(B&);int set(B&); int get() return i;int get() return i; A(int x) i=x;A(int x) i=x;class Bclass B int i;int i;public:public: B(int x) i=x;B(int x) i=x;28.3.2.2 友元类友元类friendA;intA:set(B&b)returni=b.i;voidmain()Aa(1);Bb(2);couta.get()”,”;a.set(b);couta.get()endl;29.3.2.2 友元类友元类关于友元,还有两点需要注意:关于友元

23、,还有两点需要注意:友友元元关关系系不不具具有有传传递递性性。B类类是是A类类的的友友元元,C类类是是B类类的的友友元元,C类类和和A类类之之间间如如果果没没有有声声明明,就没有任何友元关系,不能进行数据共享。就没有任何友元关系,不能进行数据共享。友友元元关关系系是是单单向向的的。如如果果声声明明B类类是是A类类的的友友元元,B类类的的成成员员函函数数就就可可以以访访问问A类类的的私私有有和和保保护护数数据据,但但A类类的的成成员员函函数数却却不不能能访访问问B类类的的私私有有和和保护数据。保护数据。 30.3.2.3 友元的使用友元的使用例例3.7 3.7 编写一个程序,求一个点到直线的距离

24、。编写一个程序,求一个点到直线的距离。 #include #include #include #include class Line; /class Line; /前向声明前向声明class Pointclass Pointprivate:private:int x,y;int x,y;public:public:Point(int xx,int yy) x=xx; y=yy; Point(int xx,int yy) x=xx; y=yy; void display()void display()coutPoint:( x , y )endl;coutPoint:( x , y )endl;

25、 friend double distance(Line &l,Point &p);friend double distance(Line &l,Point &p);31.3.2.3 友元的使用友元的使用classLineprivate:inta,b,c;public:Line(intaa,intbb,intcc)a=aa;b=bb;c=cc;voiddisplay()coutLine:ax+b0?(cout+cendl):c=0?(coutendl):(coutc=0endl);frienddoubledistance(Line&l,Point&p);32.3.2.3 友元的使用友元的使用doubledistance(Line&l,Point&p)doubledist;dist=abs(l.a*p.x+l.b*p.y+l.c)/sqrt(l.a*l.a+l.b*l.b);returndist;voidmain()Pointp1(8,8);p1.display();Linel1(2,7,-5);l1.display();coutd=distance(l1,p1)endl;33.

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号