版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第十四章 静态成员与友元 假设想让类的一切对象在类的范围内共享某个数据,声明为static的类成员便能在类范围中共享,称之为静态成员。15.1 静态成员的运用 成员有数据成员和成员函数之分,静态成员也有静态数据成员和静态成员函数之分。静态成员用static声明。 例如,下面的程序在类中定义了一个静态数据成员和一个静态成员函数,在它的构造函数和析构函数中对静态数据成员进展操作,在运用程序中,调用了静态成员函数:#include #include class Studentpublic: Student(char* pName =no name) cout create one studentn
2、; strcpy(name, pName); noOfStudents+; /静态成员:每创建一个对象,学 生人数增1 cout noOfStudents endl; Student() cout destruct one studentn; noOfStudents-; /每析构一个对象,学生人数减1 cout noOfStudents endl; static int number() /静态成员函数 return noOfStudents; protected: static int noOfStudents; /假设写成noOfStudents=0;那么非法 char name40;i
3、nt Student:noOfStudents =0; /静态数据成员在类外分配空间和初始化void fn() Student s1; Student s2; cout Student:number() endl; /调用静态成员函数用类名引导void main() fn(); cout Student:number() endl; /调用静态成员函数用类名引导 数据成员noOfStudents,既不是对象s1也不是对象s2的一部分。Student类随着对象的产生,每个对象都有一个name成员值,但无论对象有多少,甚至没有,静态成员noOfStudents也只需一个。一切Student对象都共
4、享它,并且可以访问它。 在Student对象空间中,是没有静态数据成员noOfStudents的,它的空间分配并不在Student的构造函数里完成,并且空间回收也不在类的析构函数里完成。静态数据成员在程序开场运转时就存在了。15.2 静态数据成员 公共静态数据成员可被类的外部访问,维护或私有静态数据成员可被类的内部访问。 例如,下面的代码描画一个公共的静态数据成员: class Student public: Student() noOfStudents+; / static int noOfStudents; /公共静态数据成员 / ; void fn(Student& s1,Stu
5、dent& s2) couts1.noOfStudents; /此处也可以访问静态数据成员 在类的外部,访问静态数据成员的方式可以是s1.noOfStudents,它等价于s2.noOfStudents,更通常的用法是Student:noOfStudents(不能用Student.noOfStudents)。其意义是,静态数据成员是属于Student类的,而不是属于哪个特定对象的,它也不需求依赖某个特定对象的数据。 静态数据成员用得比较多的场所普通为: (1) 用来保管流动变化的对象个数; (2) 作为一个标志,指示一个特定的动作能否发生; (3) 一个指向一个链表第一成员或最后一个成
6、员的指针. 例如,下面的程序描画一个学生类,该类对象是一个个的学生,它们构成一个单向链表: #include #include class Student public: Student(char* pName); Student(); protected: static Student* pFirst; Student* pNext; char name40; ; Student* Student:pFirst =0; Student:Student(char* pName) strncpy(name,pName,sizeof(name); namesizeof(name)-1 =0; pN
7、ext =pFirst; /每新建一个结点(对象),就将其 挂在链首 pFirst =this; Student:Student() cout name pNext) if(pS-pNext=this) /找到时,pS指向当前结点的结点 pS-pNext=pNext; /pNext即this-pNext return; Student* fn() Student* pS =new Student(Jenny); Student sb(Jone); return pS;void main() Student sa(Jamsa); Student* sb =fn(); Student sc(Tra
8、cey); delete sb;15.3 静态成员函数 静态成员函数定义是类的内部实现,属于类定义的一部分。它的定义位置与普通成员函数一样。 与静态数据成员一样,静态成员函数与类相联络,不与类的对象相联络,所以访问静态成员函数时,不需求对象。假设用对象去援用静态成员函数,只是用其类型。 例如,下面的程序,两种调用静态成员函数的方法都是合法的,而且意义一样: #include class Student public: static int number() return noOfStudents; /. protected: char name40; static int noOfStuden
9、ts; ; int Student:noOfStudents = 1; void main() Student s; cout s.number() endl; /ok 用对象援用 静态成员函数 cout Student:number() endl; /ok 用类名引导静态成员函数 运转结果为: 1 1 静态成员函数与非静态成员函数的根本区别是什么? 它们的根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this。 例如: class Sc public: void nsfn(int a); /像声明Sc:nsfn(Sc* this,int a); stati
10、c 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的地址作为第一个传送的参数。 在函数内部,Sc:nsfn()对非静态成员的访问将自动地把this参数作为指向当前对象的指针。而当Sc:sfn()被调用时,没有任何对象的地址被传送。15.4 需求友元的缘由 友元函数完全是普通的C+函数,不同的是,它可以访问类的维护或私有成员,方便编程,提高了效率,但却破坏了类的封装。15.5 友元的运用 在类里声明一个普通函数,标上关键字friend,就
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 南京工业大学浦江学院《思想道德与法治》2023-2024学年第一学期期末试卷
- 安金丽苑安装工程施工组织设计
- 飞天凌空说课稿
- 队会课说课稿
- 【初中化学】化学反应的定量关系单元复习题-2024-2025学年九年级化学人教版上册
- 简易面料加工合同范本(2篇)
- 南京工业大学《文献检索》2023-2024学年第一学期期末试卷
- 医疗质量课件教学课件
- 青少年课件教学课件
- 建立4-5岁幼儿成长档案跟踪教育效果
- 《用字母表示数》 单元作业设计
- HG/T 22820-2024 化工安全仪表系统工程设计规范(正式版)
- 数学文化 课件 2-中国古代数学与九章算术
- 2024时事政治考试题库(典优)
- 第七章课程概述
- 2024《公共基础知识必刷300题》题库带答案(轻巧夺冠)
- 创新设计前沿-知到答案、智慧树答案
- 人力资源外包投标方案
- MOOC 实验室安全学-武汉理工大学 中国大学慕课答案
- 基于人工智能的文化遗产保护与传承策略
- 2024-2029年中国酒店行业发展分析及发展前景与趋势预测研究报告
评论
0/150
提交评论