C++程序设计 教学课件 ppt 作者 郑莉第5章共享与数据保护

上传人:w****i 文档编号:92482356 上传时间:2019-07-10 格式:PPT 页数:44 大小:558KB
返回 下载 相关 举报
C++程序设计 教学课件 ppt 作者 郑莉第5章共享与数据保护_第1页
第1页 / 共44页
C++程序设计 教学课件 ppt 作者 郑莉第5章共享与数据保护_第2页
第2页 / 共44页
C++程序设计 教学课件 ppt 作者 郑莉第5章共享与数据保护_第3页
第3页 / 共44页
C++程序设计 教学课件 ppt 作者 郑莉第5章共享与数据保护_第4页
第4页 / 共44页
C++程序设计 教学课件 ppt 作者 郑莉第5章共享与数据保护_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《C++程序设计 教学课件 ppt 作者 郑莉第5章共享与数据保护》由会员分享,可在线阅读,更多相关《C++程序设计 教学课件 ppt 作者 郑莉第5章共享与数据保护(44页珍藏版)》请在金锄头文库上搜索。

1、1,第 5 章 共享与数据保护,清华大学 郑 莉,2,目录,5.1 类的静态成员 5.2 友元类 5.3 共享数据的保护,3,5.1类的静态成员,全局变量是实现数据共享的一种方法,类的对象与对象之间数据的共享可以通过全局变量实现,但是这种方法与类的信息隐藏实现相矛盾 为了安全起见,在C+中应该尽量减少全局变量的使用 在C+中要实现类的对象与对象之间数据的共享,可以使用静态成员。静态成员不是属于某个对象的,而是属于类的。它是某个类的对象共同拥有的。静态成员可以分为静态数据成员和静态函数成员,4,5.1.1 静态数据成员,被类的所有对象所共享,而不是属于某个对象的 只需存储一次,就可以供所有对象使

2、用,从而可以节省空间 由于被所有对象共享,因此它的值对每一个对象都是一样的 静态数据成员可以被类的对象或者类更改,而且这种更改对所有类的对象都有效,5.1 类的静态成员,5,5.1.1 静态数据成员,声明:定义或声明在类内部,在该成员名的类型前加关键字static 初始化:在类外部进行,一般放在类的实现部分,也可以放在其他位置,比如在主函数前面等 初始化格式: 数据类型 类名:静态数据成员名 = 初始值; 在初始化时,只能使用类名来访问静态数据成员 访问:如果静态数据成员是public类型的,则在类外部既可以使用类名限定来访问,也可以使用对象名限定来访问,5.1 类的静态成员,6,5.1.1

3、静态数据成员,例5-1静态数据成员初始化和访问,5.1 类的静态成员,class Fruit /定义Fruit类 public: Fruit(float newVolume=0.1,float newWeight=0.1); Fruit(Fruit /Fruit类的静态数据成员,7,5.1.1 静态数据成员,Fruit:Fruit(float newVolume,float newWeight) volume = newVolume; weight = newWeight; fruitNum +;/将静态数据成员fruitNum的值加一 Fruit:Fruit(Fruit/将静态数据成员fru

4、itNum的值加一 ,5.1 类的静态成员,8,5.1.1 静态数据成员,Fruit:Fruit() /Fruit类的析构函数定义,其功能是将静态数/据成员fruitNum的值减一 fruitNum-; /以下为Fruit类的其他函数实现 float Fruit:GetVolume() return volume; float Fruit:GetWeight() return weight; ,5.1 类的静态成员,9,5.1.1 静态数据成员,int Fruit:GetFruitNum() return fruitNum; int Fruit:fruitNum = 0;/*在main函数的前

5、面,将Fruit类的静态数据成员fruitNum的值初始化为0。这里使用类名Fruit来限定引用静态数据成员fruitNum,虽然fruitNum是private型的,但是却可以直接以这种方式初始化。除了这种场合,在其他地方,例如主函数main()内部,就不允许直接访问了。*/,5.1 类的静态成员,10,5.1.1 静态数据成员,int main() Fruit f1; /定义Fruit类的第一个对象f1 cout“after f1,f1.fruitNum=“f1.GetFruitNum()endl; Fruit f2(0.3,0.4); /定义Fruit类的第二个对象f2 cout“aft

6、er f2,f1.fruitNum=“f1.GetFruitNum()endl; cout“after f2,f2.fruitNum=“f2.GetFruitNum()endl; Fruit f3(f2); /定义Fruit类的第三个对象f3 cout“after f3,f1.fruitNum=“f1.GetFruitNum()endl; cout“after f3,f2.fruitNum=“f2.GetFruitNum()endl; cout“after f3,f3.fruitNum=“f3.GetFruitNum()endl; return 0; ,5.1 类的静态成员,11,5.1.1

7、静态数据成员,例5-1静态数据成员初始化和访问 程序分析: 在上面的例子中,类Fruit的数据成员fruitNum被声明为静态的,用来统计Fruit类的对象个数。在main函数的前面,设置fruitNum的初始值为0。在两个构造函数中,对非静态数据成员初始化之后,都使fruitNum加1。这样,每新建一个Fruit对象,fruitNum的值就增加1,因此fruitNum就表示Fruit类的对象个数。 注意初始化fruitNum为0的那行代码。这里使用类名来引用静态数据成员,虽然fruitNum是Fruit类的private型的,但是却可以直接初始化。除了这种场合,在其他地方,例如主函数内部,就

8、不允许直接访问了,5.1 类的静态成员,12,5.1.1 静态数据成员,例5-1静态数据成员初始化和访问 输出结果:,5.1 类的静态成员,after f1,f1.fruitNum=1 after f2,f1.fruitNum=2 after f2,f2.fruitNum=2 after f3,f1.fruitNum=3 after f3,f2.fruitNum=3 after f3,f3.fruitNum=3,13,5.1.2 静态函数成员,静态函数成员和静态数据成员都属于静态成员,对静态函数成员的声明及定义和静态数据成员一样,在返回值类型前加上static关键字。静态函数成员的定义既可以在

9、类内部,也可以定义在类外部 对公共型的静态函数成员,可以通过类名限定或者对象名限定来调用,而非静态函数成员只能通过对象名调用 静态函数成员可以直接访问该类的静态成员,而静态函数成员访问非静态成员必须通过参数传递的方式得到对象名,然后通过对象名来访问,5.1 类的静态成员,14,5.1.2 静态函数成员,访问举例: class A public: static void f(A a); /类A的静态函数成员,参数为类A的对象 static void h(); /类A的静态函数成员,无参数 void g(); private: int x; static int y; /类A的静态数据成员 ; v

10、oid A:h() /类A的静态函数成员定义 ,5.1 类的静态成员,15,5.1.2 静态函数成员,访问举例: void A:g() /类A的非静态函数成员定义 int A:y = 0; /设置类A的静态数据成员 void A:f(A a) coutx; /非法,在静态函数成员中不能访问非静态数据成员 couta.x; /合法,可以通过对象名访问 couty; /合法,静态函数成员可以访问静态数据成员 g(); /非法,在静态函数成员中不能访问非静态函数成员 h(); /合法,在静态函数成员中可以访问静态函数成员 ,5.1 类的静态成员,16,5.1.2 静态函数成员,例5-2 具有静态数据

11、成员和静态函数成员的Fruit类,5.1 类的静态成员,class Fruit /定义Fruit类,具有静态成员和非静态成员 public: /和例5-1一样 static int GetFruitNum();/Fruit类的静态函数成员 private: float volume; float weight; static int fruitNum; /Fruit类的静态数据成员 ; int Fruit:GetFruitNum() return fruitNum; /通过静态函数成员访问静态数据成员 int Fruit:fruitNum = 0; /设置Fruit类的静态数据成员/fruit

12、Num,可以用类名直接访问,17,5.1.2 静态函数成员,int main() cout“before f1,Fruit:fruitNum=“Fruit:GetFruitNum()endl; Fruit f1; /定义第一个Fruit对象 /主函数中就可以通过类名Fruit限定来调用静态函数成员GetFruitNum() cout“after f1,Fruit:fruitNum=“Fruit:GetFruitNum()endl; Fruit f2(0.3,0.4); cout“after f2,Fruit:fruitNum=“Fruit:GetFruitNum()endl; Fruit f3

13、(f2); cout“after f3,Fruit:fruitNum=“Fruit:GetFruitNum()endl; return 0; ,5.1 类的静态成员,18,5.1.2 静态函数成员,例5-2 具有静态数据成员和静态函数成员的Fruit类 例5-1相比,只是将GetFruitNum改成静态函数成员,这样,在主函数中就可以通过类名来调用GetFruitNum了 输出结果:,5.1 类的静态成员,before f1,Fruit:fruitNum=0 after f1,Fruit:fruitNum=1 after f2,Fruit:fruitNum=2 after f3,Fruit:f

14、ruitNum=3,19,5.2友元类,类的封装性和隐藏实现,使类中的私有成员只能通过类中的函数成员才能访问,而程序中其他类的函数成员是无法访问私有成员的。如果在程序中需要访问类的私有成员,就必须通过对象来调用类的函数成员,而频繁的传递对象而产生的空间和时间消耗将会影响程序的效率 可以将需要访问类的私有成员的类定义为前者的友元类,使得友元类的函数成员可以访问前者的私有成员,20,5.2友元类,友元类的定义使用freind关键字,其格式为: class 类A名 /类A的成员 friend class 类B名; ; 如果类B为类A的友元类,则B的函数成员可以访问类A的私有成员,非友元类则不能访问,

15、21,5.2友元类,举例:,class A public: friend class B; 、 /类B为A的友元类 int i; void f() private: int j; void g() ;,class B public: void AccessClassA(); /类B的函数成员 private: A a; ; class C public: void AccessClassA(); /类C的函数成员 private: A a; ;,22,5.2友元类,举例:,void B:AccessClassA() /由于B是A的友元类,所以其函数成员可以访问类A的所有成员 int i = a

16、.i; a.f(); int j = a.j; a.g(); ,void C:AccessClassA() /下面两行合法。C不是A的友元类,但其函数成员可以访问A的公共成员 int i = a.i; a.f(); /下面两行非法,C不能访问A的私有成员 int j = a.j; a.g(); ,23,5.2友元类,在上例中,定义类B为类A的友元类,这样B的函数成员AccessClassA中能够访问A的私有成员i,而类C不是A的友元类,故在C的函数成员AccessClassA中不能访问A的私有成员,24,5.2友元类,例5-3 友元类和静态数据成员的使用,class A /定义类A public: friend class B;/类B为类A的友元类 void SetX(int i

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号