文档详情

C語言 第5章.ppt

发布:2017-06-01约3.78万字共200页下载文档
文本预览下载声明
第5章 静态成员与友员 5.1 静态成员的需要性 5.2 静态数据成员 5.3 静态函数成员 5.4 静态成员的使用 5.5 友元的使用 5.6 编程实例 5.1 静态成员的需要性 类是类型而不是数据对象,每个类的对象都是该类数据成员的拷贝。然而,往往需要让类的所有对象在类的范围内共享某个数据,这些数据是类中所有对象共有的。声明为static类的成员便能在类的范围内共享,称为静态成员。 例如,建立一个学生链表,在Student类中,声明链表的首指针和学生人数。 class Student { //... protected: Student * pFirst; //链表首指针 int count; //学生人数 }; 这个类声明意味着每个学生对象都有一个链表首指针和学生数,要想得到现有的学生数,不能到类中去取,因为类不是一个占有内存的实体。而到对象中去取,则要求一旦学生人数变化,就要对每个对象进行修改。 如果将学生数的定义count放在全局变量中,则它们在类的外面,不符合面向对象要求的封装性和重用性。 例如,下面的代码用全局变量来表示学生类链表首指针和学生人数。 class Student { //... }; int count; //记录学生人数,是全局变量 Student * pFirst; //学生类链表首指针,是全局变量 void fn() { Student stud1; //创建第一个学生对象 count ++; //学生人数加1 pFirst=stud1; //对pFirst没有约束 } //fn()退出时,stud1作用域终止,stud1被析构 由于count和pFirst均为全局变量,在庞大的程序中,没有真正指明哪个函数对它们负责,这种无规则会引起软件设计的混乱,一旦程序变大,维护量就急剧上升。同时,在重用Student类的时候,总是还要额外地考虑全局变量的处置,这不得不使类的封装性受到伤害。若能将学生人数和链表首指针封装在类里面,则count和pFrirst可以受到保护,还可以作为一个类而重用,这种属于类的一部分,但既不适于用普通成员表示,也不适于用全局变量表示的数据,用静态成员来表示。 5.2 静态数据成员 在一个类中,若将一个数据成员说明为static,这个成员就成为静态数据成员。静态数据成员是类的所有对象共享的成员因此,静态数据成员被看做是类的成员而不是某个对象的成员。 静态数据成员有以下特点: (1) 使用静态数据成员可以节省内存。因为无论建立多少个类的对象,都只有一个静态数据成员的拷贝,即对多个对象来说,静态数据成员只有一个,供所有对象共用。 (2) 静态数据成员是静态存储的,必须对它进行初始化。静态数据成员的初始化与一般数据成员的初始化不同,其格式如下: 数据类型 类名:: 静态数据成员名=值; 静态数据成员采用如下方式声明、分配内存空间和初始化: class className { public: protected: static int abc; //声明静态数据成员,未分配空间 }; int className::abc = 0; //静态数据成员在类声明外分配空间和初始化 注意: l 初始化是在类体外进行的,在类中不为它分配内存空间; l 初始化时不加该成员的访问权限控制符private、protected、public; l 初始化时必须使用作用域运算符(::)来表明它所属的类。 公共静态数据成员可被类的外部访问(即访问控制权限设为public),保护或私有静态数据成员只可被类的内部访问,上面的代码描述了一个保护静态数据成员。 访问静态数据成员时,采用如下格式:
显示全部
相似文档