第12章静态成员和友元_第1页
第12章静态成员和友元_第2页
第12章静态成员和友元_第3页
第12章静态成员和友元_第4页
第12章静态成员和友元_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

第12章静态成员和友元学习要点:掌握静态成员和友元的概念熟练掌握如何定义和使用静态成员熟练掌握如何定义和使用友元12.1静态成员对象是类的实例,类刻划了一组具有相同属性的对象类中声明的成员变量属于实例化后的对象,有多个拷贝12.1静态成员参看第十一章对程序中生成的文件对象计数的例子为了计算生成的对象的个数,需要定义一个全局变量,以便在各个文件中都访问这个变量

intFileCount=0;外部全局变量在整个程序中都是可见的,因此可以达到数据共享的目的对程序中生成的文件对象计数//file.cppexternintFileCount;//在主程序中定义的全局变量File::File(char*name){ length=0; strcpy(filename,name); contents=NULL;

FileCount++;}File::File(File&srFile){ length=srFile.length; strcpy(filename,"copyof"); strcat(filename,srFile.filename); contents=newchar[length]; strcpy(contents,srFile.contents);

FileCount++;}修改类File,使能对程序中生成的文件对象计数File::~File(){ delete[]contents;

FileCount--;}对程序中生成的文件对象计数#include<iostrem.h>#include“File.h”intFileCount=0;voidmain(){ cout<<“Filenumber:“<<FileCount<<endl; Filef1; Filef2("myfile");File*pFile=newFile(“Newfile"); cout<<“Filenumber:“<<FileCount<<endl; deletepFile;cout<<“Filenumber:“<<FileCount<<endl;}修改类File,使能对程序中生成的文件对象计数程序的运行结果:Filenumber:0Filenumber:3Filenumber:2静态成员为了安全起见,在程序中很少用全局变量从封装和面向对象的角度,FileCount应属于File类FileCount是反映类的特性的,而不是某个对象

Filef1,f2;多个对象之间如果要实现数据共享,可以使用静态的数据成员

静态成员一个类的静态成员是用来表示类的属性的,而不是对象的属性的成员类定义中声明的静态变量被该类的对象所共享,即,对该类的所有对象,类的静态成员变量只有一个拷贝定义方法:在类成员前面加上static关键字静态成员分静态数据成员和静态成员函数

静态数据成员

公共静态数据成员可被类的外部访问,保护或私有的静态数据成员只可被类的内部访问。静态数据成员是类的所有对象的共享成员,而不是属于某个对象的成员。

例如:classA {intx,y; staticintshared;..... }; intA::shared=0; Aa,b;静态数据成员---注意静态数据成员作为全局变量,其存储空间是在类外分配的,因此静态数据成员不能在类内初始化,也不能用构造函数初始化静态数据成员。静态数据成员必须在类的实现部分初始化,初始化时不需要加static,但静态数据成员前面必须使用作用域运算符“::”来标明它所属的类。

修改File类classFile{//….private:staticintFileCount;//私有的,外界不可直接访问//……}classFile{//….public:staticintFileCount;//公有的//……}静态变量也遵循类的访问控制例:看下面程序的运行结果

classMyclass{ public: voidGetSum(inta); staticintSum; private: intA;};voidPrintSum(Myclass&A){ cout<<"Sum="<<A.Sum<<endl;}例:看下面程序的运行结果

intMyclass::Sum=10;//必须在类外部对静态数据成员初始化voidMyclass::GetSum(inta){ A=a; Sum+=A;}voidPrintSum(Myclass&A){ cout<<"Sum="<<A.Sum<<endl;}例:看下面程序的运行结果

voidmain(){ MyclassM,N; M.GetSum(3); N.GetSum(7); PrintSum(M);}输出结果:sum=20静态成员函数

静态成员函数与静态数据成员一样都属于类的静态成员,都不是对象成员。因此,对静态成员不能进行默认访问。即必须指明对象名或类名。在静态成员函数中不允许引用非静态成员。静态成员函数中可以访问对象中的非静态成员。

例---看下面程序的执行结果

classM{ public: M(inta){A=a;B+=a;} staticvoidf1(Mm); private: intA; staticintB;};例1---看下面程序的执行结果

voidM::f1(Mm){ cout<<”A=”<<m.A<<endl;//在静态成员函数中,只能通过对象访问类的非静态成员

cout<<”B=”<<B<<endl; //B是静态成员,可以在静态成员函数中访问} intM::B=0;例1---看下面程序的执行结果

voidmain(){ MP(5),Q(10); M::f1(P);//访问静态成员函数,前面必须是类名,下同。

M::f1(Q);}输出结果:A=5B=15A=10B=15例2---看下面程序的执行结果

classStudent{ public: staticintnumber() { returnnoOfStudents; } protected: charname[40]; staticintnoOfStudents; };intStudent::noOfStudents=1;例2---看下面程序的执行结果

voidmain(){ Students; cout<<s.number()<<endl;//用对象引用静态成员函数

cout<<Student::number()<<endl;//用类名引用静态成员函数}运行结果11例3:计算当前类的实例的个数12.2友员类具有封装和信息隐藏的特性

只有类的成员函数才能访问类的私有成员

非成员函数可以访问类中的公有成员

如果将一个函数或者类声明为另一个类的友员,那么它就可以存取那个类的私有成员。-----称为友员12.2友员语法:在声明前加上friend友元可以是一个函数,该函数称为友元函数;友元也可以是一个类,该类被称为友元类

友员可当作类成员对待,并且对私有成员的访问不受限制。例---看下面程序的执行结果classPoint{ public: Point(doublexx,doubleyy){x=xx;y=yy;} voidGetxy(); frienddoubleDistance(Pointa,Pointb); private: doublex,y;};例---看下面程序的执行结果voidPoint::Getxy(){ cout<<”(“<<x<<”,”<<y<<”)”<<endl;}doubleDistance(Pointa,Pointb){ doubledx=a.x-b.x;//对象的私有成员一般只有成员函数才能访问,这里友元函数中允许访问对象的//私有成员

doubledy=a.y-b.y; returnsqrt(dx*dx+dy*dy);}例---看下面程序的执行结果voidmain(){ Pointp1(3.0,4.0),p2(6.0,8.0); p1.Getxy(); p2.Getxy(); doubled=Distance(p1,p2);cout<<”Distanceis”<<d<<endl;}输出结果:(3,4)(6,8)Distanceis5友员声明友员不是成员一个类的成员声明为友员友员类12.2.2使用友员的条件一个函数需要经常而且大量地访问一个类的数据成员一个类从属于另一个类,而且一般不单独使用,而是通过另一个类的对象来发挥使用。运算符重载12.2.3友员---注意的问题友员函数和一般的函数没有什么区别,它独立于类之外友员函数是对类操作的一种补充友员不是成员,不能用this指针来访问它12.2.3友员---注意的问题友员破坏了封装性,要慎用友元不是双向的友元不具有传递性,即,假设B是A的友元、C是B的友元,如果没有显

温馨提示

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

最新文档

评论

0/150

提交评论