版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第15章 静态成员与友元2本章主要内容 15.1 静态成员的需要性 15.2 静态成员的使用 15.3 静态数据成员 15.4 静态成员函数 15.5 需要友员的原因 15.6 友员的使用 作业3如果类的某些属性希望他的所有对象共享,怎么办?数据共享途径: 途径一:全局变量或全局对象具有局限性破坏程序模块结构属于程序,而不属于类途径二:静态成员被该类的所有对象共享15.1 静态成员的需要性415.1 静态成员的需要性目的:类的所有对象共享某些资源 class Student / ; int count; /学生人数 Student * pFirst; /学生类链表首指针 void fn( )
2、 Student ss; /创建第一个学生对象 count+; /学生人数增1 pFirst=&ss; /没有对pFirst约束,随便乱用,完全没把它当链首指针 /fn( )退出时,ss作用域中止并被析构 ,可学生人数忘了减1 515.2 静态成员的使用静态成员是类中的成员,是类的一部分,在类外不可任意访问,从而起到保护作用。静态成员有静态数据成员和静态成员函数之分。声明格式:static 成员声明;静态数据成员与静态变量相似,具有静态生存期,是在类中声明的全局数据成员,能被同一个类的所有对象所共享。公有静态成员函数不仅可以通过类对象来访问,还可通过“类名:静态成员函数”的形式在程序中直接调用
3、。615.2 静态成员的使用/ ch15_1.cpp#include #include class Student protected: static int noOfStudents; char name40; public: Student(char* pName =no name) cout create one studentn; strncpy(name, pName,40); name39=0; noOfStudents +; /静态成员:每创建一个对象,学生人数增1 cout noOfStudents endl; static int number( ) /静态成员函数 retu
4、rn noOfStudents; Student( ) cout destruct one studentn; noOfStudents-; /每析构一个对象,学生人数减1 cout noOfStudents endl; ; int Student:noOfStudents =0; /静态数据成员在类外分配空间和初始化 void fn( ) Student s1; Student s2; cout Student:number( ) endl; /调用静态成员函数用类名引导 int main( ) fn( ); cout Student:number( ) endl; /调用静态成员函数用类名
5、引导 运行结果: creat one student 1creat one student22 destruct one student1destruct one student00715.2 静态成员的使用静态数据成员不是某一个对象的一部分,而是所有对象共享它,并且能够访问它。静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。 这样,静态数据成员的空间分配有三个可能的地方:(1)作为类的外部接口的头文件,那里有类声明;(2)类定义的内部实现,那里有类的成员函数定义;(3)应用程序的main( )函数前的全局数据声明和定义
6、处。 815.2 静态成员的使用例如,下面的代码重用Student类,但在应用程序中不得不再定义Student类的静态数据成员:/student.h 类定义class Student protected: static int noOfStudents; /静态数据成员声明 char name40; public: Student(char* pName =no name); Student( ); static int number( ); /静态成员函数声明 ;915.2 静态成员的使用/student.cpp类的内部实现#include #include #include student
7、.hStudent:Student(char* pName) cout create one studentn; strncpy(name, pName, 40); name39 = 0; noOfStudents+; cout noOfStudents endl; Student:Student( ) cout destruct one studentn; noOfStudents-; cout noOfStudents endl; int Student:number( ) /静态成员函数 return noOfStudents; 1015.2 静态成员的使用file2.cpp /应用程序
8、重用了Student类#include “student.h”#include int Student:noOfStudents=0; /初始化静态成员,不便于重用void fn( ) Student s1; Student s2; coutStudent:number( )endl;int main( ) fn( ); coutStudent:number( )endl; return 0; 1115.2 静态成员的使用静态数据成员是类的一部分,静态数据成员的定义是类定义的一部分,故可将其放在类的内部实现部分中定义。定义时,要用类名引导。重用该类时,简单地包含其头文件即可。 例如,下面的程序
9、将ch15_1.cpp改成了多文件程序实现结构: / student.h class Student protected: static int noOfStudents; /静态数据成员声明 char name40; public: Student(char* pName =no name); Student( ); static int number( ); /静态成员函数声明 ;1215.2 静态成员的使用/student.cpp类的内部实现#include #include #include “student.h”int Student:noOfStudents = 0;Student
10、:Student(char* pName) cout create one studentn; strncpy(name, pName, 40); name39 = 0; noOfStudents+; cout noOfStudents endl; Student:Student( ) cout destruct one studentn; noOfStudents-; cout noOfStudents endl; int Student:number( ) return noOfStudents; 1315.2 静态成员的使用/ch15_2.cpp #include student.h /
11、重用Student类 #include void fn( ) Student s1; Student s2; cout Student:number() endl; int main() fn( ); cout Student:number() endl; return 0; 工程文件ch15_2.prg包含: student.cppch15_2.cpp1415.3 静态数据成员使用静态数据成员可以节省内存,因为它只存储一处,供所有对象共享。静态数据成员的值是可修改的,但它对每个对象都是一样的。1. 定义和使用与静态变量相似,静态数据成员是静态存储(static)的,它必须按下列两个步骤进行:
12、在类中使用关键字static声明静态数据成员。 在类外为静态数据成员分配内存空间并初始化。 其定义格式如下::=15【例】静态数据成员的使用示例#include using namespace std;class CSum public:CSum(int a = 0, int b = 0) /A nSum += a+b; int getSum() return nSum; void setSum(int sum) nSum = sum; private:static int nSum;int CSum:nSum = 0;int main()CSum one(10, 2), two;couton
13、e:sumone.getSum()endl;couttwo:sum=two.getSum()endl;two.setSum(5);coutone:sum=one.getSum()endl;couttwo:sum=two.getSum()endl;return 0;运行结果:one:sum=12two:sum=12one:sum= 5two:sum=51615.3 静态数据成员2. 几点说明(1)静态数据成员是类中的成员,它的访问属性同普通数据成员一样,可以为public、private和protected。(2)静态数据成员的实际定义和初始化本身是不受public、private和protec
14、ted等访问属性限制的。(3)静态数据成员可看成是类中声明、类外定义的静态全局变量,具有静态生存期,在程序中从实际定义时开始产生,到程序结束时消失。 (4)当静态数据成员为public时,在类外对该成员的访问和引用可通过对象,也可直接引用。:1715.3 静态数据成员例:class CSum /public:static int nSum;int CSum:nSum=0;int main()CSum one;one.nSum=10;CSum:nSum=12; /常用方式coutone.nSumendl;return 0;1815.3 静态数据成员例: class Student public:
15、 Student( ) noOfStudent+; / static int noOfStudent; /公共静态数据成员 / ; void fn(Student& s1,Student& s2) couts1.noOfStudents; cout Student:noOfStudents; /此处也可以访问静态数据成员 193. 静态数据成员的使用场合:(1) 用来保存流动变化的对象个数;(2) 存储链表的第一个或者最后一个成员的内存地址 一个指针;(3) 作为一个标记,标记一些动作是否发生;15.3 静态数据成员2015.3 静态数据成员(选讲)例ch15_4,创建一个学生单向链表。cla
16、ss Studentpublic: 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; pNext =pFirst; /每新建一个结点(对象),就将其挂在链首 pFirst =this;2115.3 静态数据成员Student:Stude
17、nt() 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;2215.3 静态数据成员void main() Student sa(Jamsa); Student* sb =fn(); Student sc(Tracey); delete sb;运行结果:JoneJennyTraceyJamsa2315.4 静
18、态成员函数静态成员函数:在类的定义体中,前面被冠以“static”的成员函数。静态成员函数和静态数据成员一样,都属于类的静态成员,但它们都不专属于某个对象,而是所有对象所共享的成员。因此,访问静态成员函数时,也不需要对象。:在类中,静态数据成员可以被成员函数或静态成员函数所引用。但反过来,静态成员函数却不能直接引用类中说明的非静态成员。 Page 232415.4 静态成员函数Page 24例如,下面的程序,两种调用静态成员函数的方法都是合法的,且意义一样: #include class Student public: static int number( ) return noOfStude
19、nts; /. protected: char name40; static int noOfStudents; ; int Student:noOfStudents = 1; int main( ) Student s; cout s.number() endl; /ok 用对象引用静态成员函数 cout Student:number() endl; /ok 用类名引导静态成员函数 2515.4 静态成员函数一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认访问。例: #include class Student public: static char* sName()/静态成员
20、函数为所有对象共享 coutnoOfStudentsendl; return name; /error哪个对象? protected: char name40; static int noOfStudents; ;26 int Student:noOfStudents=0; void fn( ) / Student s; couts.sName( )endl; /sName( )从对象s上得到的是Student类型 /故可写成:Student : sName( ) 15.4 静态成员函数2715.4 静态成员函数(选讲)静态成员函数借助静态数据成员头指针可以对非静态成员访问。例ch15-6.c
21、pp说明了一个访问对象中成员的方法: #include #include class Student public: Student(char* pName); Student( ); static Student* findname(char* pName); protected: static Student* pFirst; Student* pNext; char name40; ;Page 2728 Student* Student:pFirst = 0; /静态成员空间分配及初始化 Student:Student(char*pName)/头插法 strncpy(name,pName
22、, sizeof(name); namesizeof(name)-1=0; pNext=pFirst; pFirst=this; Student:Student( ) if(pFirst=this)pFirst=pNext; return; for(Student* pS=pFirst; pS; pS=pS-pNext) if(pS-pNext=this) pS-pNext=pNext; return; /查找被析构的节点 Page 2815.4 静态成员函数2915.4 静态成员函数Student* Student:findname(char* pName)/静态成员函数 for(Stude
23、nt* pS=pFirst; pS; pS=pS-pNext) if(strcmp(pS-name,pName)=0) return pS; return (Student*)0;int main( ) Student s1(Randy); Student s2(Jenny); Student s3(Kinsey); Student* pS =Student:findname(Jenny) if(pS) cout ok. endl; else cout no find. endl; return 0;3015.5 需要友元的原因问题的提出:对象的保护和私有成员:只允许本类的成员函数访问 为了提
24、高效率,希望本类以外的对象或函数能够访问类中的保护和私有成员 友元:提供了本类外的对象访问保护和私有成员的途径。Page 3031友元:一个类的友元可以访问这个类的保护和私有成员(公有成员当然能够访问,但是一般不要改变其值。)友元可以是下列之一: (1)友元函数不属于任何类的一般函数 (2)友元成员函数另一个类的某个成员函数 (3)友元类另一个类(整个类作友元)注意:友元使得类的封装性受到影响,程序的可维护性变差,应慎重使用 Page 3115.5 需要友元的原因3215.6 友元的使用友元的声明和定义友元声明:友元声明的位置可在类的任何部位,既可在public区,也可在protected区,
25、意义完全一 样。友元的定义:友元不属于本类的成员,所以友元的定义不能在本类的定义体中。 1. 友元函数友元函数:不属于任何类的、被声明为某个类的友元的一般函数。友元函数定义在类的外部,一般与类的成员函数定义放在一起。格式:friend (形参表) #includeclass A protected: int x,y; public: int z; A(int xx=0,int yy=0,int zz=0):x(xx),y(yy),z(zz) friend void in(A); friend void sh(A); ;void in(A a1) couta1.xa1.ya1.z; couta1
26、.x a1.y a1.zendl; void sh(A a2) couta2.x a2.y a2.zendl; int main() A a1(11,22,33); sh(a1); in(a1); sh(a1); return 0;3415.6友元的使用2.友元成员函数友元成员函数:其他某个类的成员函数,是本类的友元格式: friend 函数返回类型 类名标识符:函数名(参数列表);说明:友元成员函数的声明,除了前面冠以“friend”外,还要注明所属类的类名。友元成员函数应该在自己所属类的定义体中进行定义。3515.6友元的使用class Student; /前项声明,类名声明class T
27、eacher / public: void assignGrades(Student& s); /给定成绩 protected: int noOfStudents; Student * pList100; ; class Student public: / friend void Teacher:assignGrades (Student&s); /是学生类的友元成员函数,同时又是教师类的成员函数 Page 353615.6友元的使用 protected: Teacher * pT; int semesterHours; float gpa; ; void Teacher:assignGrades(Student& s) s.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 古建筑文化遗产保护技术方案
- 2026年体检行业团检与个检比例变化与趋势研判
- 2026年案例分析学术会议汇报中应对突发状况(如设备故障)的预案
- 2026年新能源(光伏、风电)接入对城市电网影响分析
- 低品位矿选矿流程设计方案
- 电商直播新媒体宣传推广方案
- 城镇污水处理厂安全评估方案
- 马安高速公路LM2合同段工程的施工方案设计
- 四川大学华西厦门医院耳鼻咽喉-头颈外科招聘1人备考题库附答案详解【培优b卷】
- 2026广东广州市南方医科大学口腔医院财务人员招聘2人备考题库附答案详解【培优b卷】
- 国家安全生产考试焊工证电子版
- 九种体质辨识课件
- 2026年乌兰察布职业学院单招职业适应性测试题库必考题
- 食品生产车间管理制度
- 电解铝生产安全保障管理方案
- 2025年重庆历史高考试题及答案
- 煤气柜检修总结课件
- 校园心理健康安全自查及整改措施
- 膝关节骨折脱位课件
- 临期药品行业市场细分消费者需求变化分析报告
- 《水力学》课件(共十一章)
评论
0/150
提交评论