先从书上的一个例子开始,明白为什么C++需要引入友元的概念。
这里认为你熟悉Point类(就是一个记录点的性质的类),如果我要由两个点Point A
和Point B
计算他们之间的距离,那么程序该如何设计呢?初学类与对象者的第一想法,在Point类里头再写一个函数呗。
想想一下情况:假设我在Point类里实现了这个函数,那在此函数中必然要用到本类的实例化对象,因为要通过这个对象访问到它的数据成员来进行距离计算嘛。恩,想想也是可以的嘛。但是这样是有问题的,这个问题不在语法上(前面假设的没毛病),而在可读性上,毕竟距离是Point与Point之间的关系,所以它不应该属于“每一个单独的点,也不属于整个Point类”。
那直接写一个函数呢?语法上也是可以的,但问题是还是“不能体现这个函数与点之间的联系”。
写到这儿我觉得前面两种解决方式也未尝对此题不可,但是考虑到C++是一个面向对象的语言,一旦用于大型程序,这些“小聪明”可能就不中了。
那到底靠什么来联系这样一层关系?这就是友元机制了。
说明了友元机制的价值之后,具体用法参见维基百科:
在面向对象程序设计中,友元函数(friend function)是一个指定类(class)的“朋友”,该函数被允许访问该类中private、protected、public的数据成员。普通的函数并不能访问这些数据,然而宣告一个函数成为一个类的友元函数则被允许访问这些数据。
友元函数的宣告可以放在类声明的任何地方,不受访问限定关键字private、protected、public的限制。一个相似的概念是友谊类。
友谊关键字应该谨慎使用。如果一个拥有private或者protected成员的类,宣告过多的友元函数,可能会降低封装性的价值,也可能对整个设计框架产生影响。
还要强调的是,友元类“不继承,单向的,不传递”。
总之,有了友元机制之后将为C++编程带来相当大的方便。
参考《C++语言程序设计(第四版)》