您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 《C++程序设计》电子教案第6章静态成员和友元
第6章静态成员与友元6.1静态成员6.2友元函数6.3友元类6.1静态成员6.1.1静态数据成员6.1.2静态成员函数返回首页6.1.1静态数据成员C++中,同一个类定义多个对象时,每个对象拥有各自的数据成员(不包括静态数据成员),而所有对象共享一份成员函数和一份静态数据成员。静态数据成员是类的所有对象中共享的成员,而不是某个对象的成员,因此可以实现多个对象间的数据共享。静态数据成员不属于任何对象,它不因对象的建立而产生,也不因对象的析构而删除,它是类定义的一部分,所以使用静态数据成员不会破坏类的隐蔽性。静态数据成员的使用方法如下:(1)静态数据成员的定义与一般数据成员相似,但前面要加上static关键词。(2)静态数据成员的初始化与一般数据成员不同,静态数据成员初始化的格式如下:类型类名::静态数据成员=值;(3)在引用静态数据成员时采用格式:类名::静态数据成员(4)静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。例6-1:用静态数据成员实现班会费管理程序。#includeiostream.hclassperson{char*name;intage;staticintcount;//定义静态成员,存放班会费public:voidsetData(char*s,intn){name=s;age=n;};voidgetData(intn){count=count+n;};voidspend(intn){count=count-n;};voiddisplay(){coutcountendl;};};intperson::count=0;//为静态数据成员分配空间和初始化voidmain(){persondemo1,demo2;demo1.setData(Robert,21);demo2.setData(Mary,18);demo1.getData(1000);demo2.display();//输出1000demo2.spend(300);demo1.display();//输出700}返回本节6.1.2静态成员函数静态成员函数与静态数据成员类似,也是从属于类,静态成员函数的定义是在一般函数定义前加上static关键字。调用静态成员函数的格式如下:类名::静态成员函数名(参数表);静态成员函数与静态数据成员一样,与类相联系,不与对象相联系,只要类存在,静态成员函数就可以使用,所以访问静态成员函数时不需要对象。静态成员函数没有this指针,因此,静态成员函数只能直接访问类中的静态成员,若要访问类中的非静态成员时,必须借助对象名或指向对象的指针。例6-3:用静态成员函数实现班会费管理程序。#includeiostream.hclassperson{char*name;intage;staticintcount;//定义静态成员,存放班会费public:voidsetData(char*s,intn){name=s;age=n;};voidgetData(intn){count=count+n;};voidspend(intn){count=count-n;};staticvoiddisplay(){coutcountendl;};//定义静态成员函数};intperson::count=0;//为静态数据成员分配空间和初始化voidmain(){persondemo1,demo2;demo1.setData(Robert,21);demo2.setData(Mary,18);demo1.getData(1000);person::display();//用类名去调用静态成员函数demo2.spend(300);demo1.display();//用对象的类型去调用静态成员函数}例6-4:写出下面程序的执行结果。#includeiostream.hclassM{public:M(inta){A=a;B+=a;}staticvoidf1(Mm);private:intA;staticintB;};voidM::f1(Mm){coutA=m.Aendl;//在静态成员函数中,只能通过对象访问类的非静态成员coutB=Bendl;//B是静态成员,可以在静态成员函数中访问}intM::B=0;voidmain(){MP(5),Q(10);M::f1(P);//访问静态成员函数,前面必须是类名,下同M::f1(Q);}输出结果为:A=5B=15A=10B=15返回本节6.2友元函数6.2.1友元函数的说明6.2.2友元函数的使用返回首页6.2.1友元函数的说明定义友元函数的方式是在类定义中用关键词friend说明该函数,其格式如下:friend类型友元函数名(参数表);友元函数说明的位置可在类的任何部位,既可在public区,也可在protected区,意义完全一样。友元函数定义则在类的外部,一般与类的成员函数定义放在一起。例6-5:友元函数示例程序。#includeiostream.hclassperson{friendvoiddisplay(person*);//声明友元函数char*name;intage;public:person(char*str,inti){name=str;age=i;}};voiddisplay(person*a)//定义友员函数{couta-namea-ageendl;}voidmain(){persondemo(dsc,30);display(&demo);//调用友员函数,不要指明对象名}运行结果为:dsc30例6-6:将其他类的成员函数定义为类的友元。#includeiostream.hclassA;classB{public:int&geti();B();B(B&);~B();B&operator=(B&);private:A*pA;friendclassA;};classA{public:voidaddout(B&b){coutTheaddressofAinBisb.pAendl;}private:inti;friendint&B::geti();};voidmain(){Bb;Aa;b.geti()=1;a.addout(b);coutb.pA-i=b.geti()endl;}B::B(){pA=newA;}B::B(B&b){pA=newA(*(b.pA));}B::~B(){deletepA;}B&B::operator=(B&b){pA=newA(*(b.pA));return*this;}int&B::geti(){returnpA-i;}运行结果为:TheaddressofAinBis0x00430030b.pA-i=1返回本节6.2.2友元函数的使用友元函数与其他普通函数的不同之处在于:友元必须在某个类中说明,它拥有访问说明它的类中所有成员的特权;而其他普通函数只能访问类中的公有成员。友元说明可以出现在类的私有部分、保护部分和公有部分,但这没有任何区别。应说明的是:使用友元虽然可以提高程序的运行效率,但却破坏了类的封装性。因此,在实际应用中应慎重使用友元。例6-7:分析下面程序的运行结果。#includeiostream.h#includemath.hclassPoint{public:Point(doublexx,doubleyy){x=xx;y=yy;}voidGetxy();frienddoubleDistance(Point&a,Point&b);private:doublex,y;};voidPoint::Getxy(){cout(x,y)endl;}doubleDistance(Point&a,Point&b){doubledx=a.x-b.x;//对象的私有成员一般只有成员函数才能访问,//这里友元函数中允许访问对象的私有成员doubledy=a.y-b.y;returnsqrt(dx*dx+dy*dy);}voidmain(){Pointp1(1.0,2.0),p2(3.0,4.0);p1.Getxy();p2.Getxy();doubled=Distance(p1,p2);coutDistanceisdendl;}输出结果:(1,2)(3,4)Distanceis2.82843返回本节6.3友元类C++允许说明一个类为另一个类的友元类(friendclass)。如果A是B的友员类,则A中的所有成员函数可以像友员函数一样访问B类中的所有成员。定义格式如下:classB{friendclassA;//A的所有成员函数均为B的友元函数//…}友元关系不可以被继承。假设类A是类B的友元,而类C从类B派生,如果没有在类C中显式地使用下面的语句:friendclassA;返回首页例6-8:分析以下程序的执行结果。#includeiostream.hclassB;classA{inti;public:intset(B&);intget(){returni;}A(intx){i=x;}};classB{inti;public:B(intx){i=x;}friendA;};intA::set(B&b){returni=b.i;}voidmain(){Aa(1);Bb(2);couta.get()”,”;a.set(b);couta.get()endl;}此程序的运行结果为:1,2返回本节
本文标题:《C++程序设计》电子教案第6章静态成员和友元
链接地址:https://www.777doc.com/doc-2844907 .html