15.1

15.1 友元

类并非只能拥有友元, 也可以将类作为友元。
友元类的所有方法都可以访问原始类的私有成员和保护成员。
也可以更严格的限制, 只将特定的成员函数作为另一个类的友元。
那些函数、成员函数或类为友元是由类定义的, 而不能从外部强加友情。

友元类

例:遥控器(Remote)和电视机(TV)
应将Remote类作为TV类的一个友元
friend class Remote; // 在TV中的任意部分无关紧要
这样Remote类就可以访问TV类的私有成员了

友元成员函数

在Tv中声明:
friend void Remote::set_chan(Tv & t, int c); // 由Tv类决定谁是它的友元
提前声明Remote类:
class Remote;
class Tv;
当Tv类中存在Remote友元函数时, 应当看见Remote类声明和友元函数的类声明。
解决方法:类声明中只放方法声明, 具体定义放在后面。
内联函数使用inline关键字:
内联函数的链接是内部的, 这意味着函数定义必须在使用函数的文件中
如果放在实现文件中, 不应当使用inline关键字, 这样函数的链接是外部的。
friend class Remote已经指出Remote是一个类, 无需向前声明。

其他友元关系

相互之间的友元

共同的友元

当函数需要访问两个类的私有数据时, 它可以是一个类的友元, 同时是另一个类的友元。有时同时将函数看作两个类的友元更合理。
例:Probe类和Analyzer类