c静态成员与友元PPT学习教案_第1页
c静态成员与友元PPT学习教案_第2页
c静态成员与友元PPT学习教案_第3页
c静态成员与友元PPT学习教案_第4页
c静态成员与友元PPT学习教案_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、会计学1c静态成员与友元静态成员与友元 如果想让类的所有对象在类的范围内共享某个数据,声明为static的类成员便能在类范围中共享,称之为静态成员。15.1 静态成员的使用 成员有数据成员和成员函数之分,静态成员也有静态数据成员和静态成员函数之分。静态成员用static声明。 例如,下面的程序在类中定义了一个静态数据成员和一个静态成员函数,在它的构造函数和析构函数中对静态数据成员进行操作,在应用程序中,调用了静态成员函数:#include #include 第1页/共41页class Studentpublic: Student(char* pName =no name) cout creat

2、e one studentn; strcpy(name, pName); noOfStudents+; /静态成员:每创建一个对象,学 生人数增1 cout noOfStudents endl; Student() cout destruct one studentn; noOfStudents-; /每析构一个对象,学生人数减1 cout noOfStudents endl; 第2页/共41页static int number() /静态成员函数 return noOfStudents; protected: static int noOfStudents; /若写成noOfStudents

3、=0;则非法 char name40;int Student:noOfStudents =0; /静态数据成员在类外分配空间和初始化void fn() Student s1; Student s2; cout Student:number() endl; /调用静态成员函数用类名引导第3页/共41页void main() fn(); cout Student:number() endl; /调用静态成员函数用类名引导第4页/共41页 数据成员noOfStudents,既不是对象s1也不是对象s2的一部分。Student类随着对象的产生,每个对象都有一个name成员值,但无论对象有多少,甚至没有

4、,静态成员noOfStudents也只有一个。所有Student对象都共享它,并且能够访问它。 在Student对象空间中,是没有静态数据成员noOfStudents的,它的空间分配并不在Student的构造函数里完成,并且空间回收也不在类的析构函数里完成。静态数据成员在程序开始运行时就存在了。15.2 静态数据成员 公共静态数据成员可被类的外部访问,保护或私有静态数据成员可被类的内部访问。 例如,下面的代码描述一个公共的静态数据成员:第5页/共41页 class Student public: Student() noOfStudents+; / static int noOfStudent

5、s; /公共静态数据成员 / ;第6页/共41页 void fn(Student& s1,Student& s2) couts1.noOfStudents; /此处也可以访问静态数据成员 在类的外部,访问静态数据成员的形式可以是s1.noOfStudents,它等价于s2.noOfStudents,更通常的用法是Student:noOfStudents(不能用Student.noOfStudents)。其意义是,静态数据成员是属于Student类的,而不是属于哪个特定对象的,它也不需要依赖某个特定对象的数据。 静态数据成员用得比较多的场合一般为:第7页/共41页 (1) 用来保存流动变化的对象

6、个数; (2) 作为一个标志,指示一个特定的动作是否发生; (3) 一个指向一个链表第一成员或最后一个成员的指针. 例如,下面的程序描述一个学生类,该类对象是一个个的学生,它们构成一个单向链表: #include #include class Student public: Student(char* pName); Student();第8页/共41页 protected: static Student* pFirst; Student* pNext; char name40; ; Student* Student:pFirst =0; Student:Student(char* pName

7、) strncpy(name,pName,sizeof(name); namesizeof(name)-1 =0; pNext =pFirst; /每新建一个结点(对象),就将其 挂在链首 pFirst =this; 第9页/共41页 Student:Student() cout name pNext) if(pS-pNext=this) /找到时,pS指向当前结点的结点 pS-pNext=pNext; /pNext即this-pNext return; 第10页/共41页Student* fn() Student* pS =new Student(Jenny); Student sb(Jon

8、e); return pS;void main() Student sa(Jamsa); Student* sb =fn(); Student sc(Tracey); delete sb;第11页/共41页15.3 静态成员函数 静态成员函数定义是类的内部实现,属于类定义的一部分。它的定义位置与一般成员函数一样。 与静态数据成员一样,静态成员函数与类相联系,不与类的对象相联系,所以访问静态成员函数时,不需要对象。如果用对象去引用静态成员函数,只是用其类型。 例如,下面的程序,两种调用静态成员函数的方法都是合法的,而且意义一样: #include class Student public:第12

9、页/共41页 static int number() return noOfStudents; /. protected: char name40; static int noOfStudents; ; int Student:noOfStudents = 1; void main() Student s; cout s.number() endl; /ok 用对象引用 静态成员函数 cout Student:number() endl; /ok 用类名引导静态成员函数 第13页/共41页 运行结果为: 1 1 静态成员函数与非静态成员函数的根本区别是什么? 它们的根本区别在于静态成员函数没有

10、this指针,而非静态成员函数有一个指向当前对象的指针this。 例如: class Sc public: void nsfn(int a); /像声明Sc:nsfn(Sc* this,int a);第14页/共41页 static void sfn(int a); /无this指针 / void f(Sc& s) s.nsfn(10); /转换为Sc:nsfn(&s,10) s.sfn(10); /转换为Sc:sfn(10) 函数nsfn()可被认为它声明为void Sc:nsfn(Sc* this,int a)。对nsfn()的调用,编译像注解的那样进行转换,s的地址作为第一个传递的参数。

11、 在函数内部,Sc:nsfn()对非静态成员的访问将自动地第15页/共41页把this参数作为指向当前对象的指针。而当Sc:sfn()被调用时,没有任何对象的地址被传递。15.4 需要友元的原因 友元函数完全是普通的C+函数,不同的是,它可以访问类的保护或私有成员,方便编程,提高了效率,但却破坏了类的封装。15.5 友元的使用 在类里声明一个普通函数,标上关键字friend,就成了该类的友元,可以访问该类的一切成员。 友元函数不是成员函数。在类的内部,只能声明它的函数原型,加上friend关键字。友元声明的位置可在类的任何部位,既可在public区,也可在protected区,意义完全一样。第16页/共41页 整个类可以是另一个类的友元,该友元称为友类。友类的每个成员函数都可访问另一个类中的保护或私有数据成员。第17页/共41页第18页/共41页第19页/共41页第20页/共41页第2

温馨提示

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

评论

0/150

提交评论