友元类即存在一个类,它是另一个类的朋友,它可以直接访问类的私有成员。友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息,即私有成员和保护成员。
当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
friend class类名;
其中,friend和class是关键字,类名必须是程序中的一个已定义过的类。
例如,以下语句说明类B是类A 的友元类:
经过以上说明后,类B的所有成员函数都是类A 的友元函数,能访问类A 的私有成员和保护成员。
使用友元类时需要注意:
(1)友元关系不能被继承。
(2)友元关系是单向的,不具有交换性。若类B 是类A 的友元,类A 不一定是类B 的友元。
(3)友元关系不具有传递性。若类B是类A 的友元,类C是B的友元,类C不一定是类A 的友元。
用友元类和友元函数解决任务中的问题。
在这里,我们再举一个例子来说明友元类的作用:假设我们要设计一个模拟电视机和遥控器的程序。大家都知道,遥控机类和电视机类是不相包含的,而且,遥控器可以操控电视机,但是电视机无法操作遥控器,这就比较符合友元的特性了,不互为友元。我们把遥控器类说明成电视机类的友元。下面是这个例子的具体代码:
【例4.5】模拟电视机和遥控器的程序。
在程序的第6行定义了一个TV 电视机类的友元类Tele,那么在程序Tele类中就可以来调用TV 类中的私有成员了,就像是使用Tele类自己的数据信息。
综合实训
静态成员和友元
【实训目的】
1.掌握静态成员的定义。
2.验证静态成员的特性。
3.掌握友元的定义。
4.验证友元的特性。
5.练习在类设计时使用静态成员和友元特性达到需求的效果。
【实训内容】
1.某商店经销一种商品,商品采购和销售时以箱为单位,但各箱的重量不一样,因此,商店需要记录目前库存的总重量。现在设计程序模拟商店商品的采购和销售的情况。提示:使用静态数据成员记录总重量,用静态成员函数返回总重量。用链表记录商品。
2.设计一个点类,再设计一个友元函数,计算两点之间的距离。
【实训设计】
1.参考代码
2.参考程序为:
项目小结
本项目中,我们学习了面向对象程序设计中的静态成员和友元的基本知识。
静态成员包括静态数据成员和静态成员函数,静态数据成员用于描述类本身特性,静态成员函数用于体现类本身的行为,两者都是类的而不是某个对象的。静态数据成员需要在类体外初始化。静态成员函数可以直接使用静态数据成员,不可以直接使用一般数据成员。静态数据成员和静态成员函数的调用方式一样,都可以使用类名::或对象名.的方式调用。(www.daowen.com)
友元是被声明类的朋友,可以访问类中的所有成员。友元有友元函数和友元类两种表现形式。友元函数就是在类中声明某个函数是类的朋友,则此函数就可以直接使用类中的成员了。友元类就是在A 类中声明B类是A 类的朋友,则B类就是A 类的友元类,B类的所有成员函数都可以直接使用类中的成员了。友元虽然可以提高编程的灵活性,但它破坏了被声明类的封装性,所以在面向对象程序设计中友元是限制使用的。
课后练习
一、填空题
1.静态成员是属于______的,它除了可以通过对象名来引用外,还可以使用_______来引用。
2.友元函数是被说明在______内的______成员函数。友元函数可访问该类中的______成员。
3.在某个函数体内定义一个静态类的对象sa,格式为_________。
二、判断题
1.静态成员是指静态对象的成员。( )
2.静态数据成员必须在构造函数的成员初始化列表中进行初始化。( )
3.静态成员都可以使用类名加作用域运算符的方法来引用。( )
4.静态成员函数中引用静态数据成员和非静态数据成员的方式是相同的。( )
5.静态成员都是使用static来说明的。( )
6.静态成员是属于类的,不是属于某个对象的。( )
7.静态成员只可以用类名加作用域运算符来引用,不可用对象引用。( )
8.静态数据成员的初始化是在类体外进行的。( )
9.静态成员属于类的,每个对象都可以引用该静态成员。( )
10.友元函数是说明在类体内的非成员函数,它可以访问类中的所有成员。( )
11.友元类中的所有成员函数都是友元函数。( )
12.友元函数不是成员函数。( )
13.友元函数只可访问类的私有成员。( )
14.友元函数的调用方法同一般函数。( )
15.友元函数可以是另一类中的成员函数。( )
16.友元函数能访问类中的保护成员。( )
17.友元函数访问类中私有成员与成员函数访问私有成员的形式相同。( )
18.可以把一个一般函数说明为某类的友元函数,也可以将某类的成员函数说明为另类的友元函数。( )
资源推荐
1.C++网站 http://www.cplusplus.com
2.C++类库参考 https://msdn.microsoft.com/zh-cn/library/cscc687y.aspx
3.百度传课 http://www.chuanke.com/course/72351176561000448________2.html
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。