友元关系

public, protected和private等访问级别可以让程序员控制谁有权使用某个类里的方法和属性。这个强大的工具可以把代码的实现细节隐藏起来,不让没有相应权限的其他代码看到。可是在某些场合,一个完全无关的类需要访问某个protected成员,甚至是private成员,该怎么办?当然可以把所有的东西都声明成publc,但这会让任何代码都可以使用那些public方法和属性,而不仅限于真需要你这么做的那几个类。如时你坚持使用protected,那又会让每一个需要访问那些方法和属性的人不得不先从这个类派生出一个子类,再通过那个子类进行访问,这违背了你的初衷。还好,C++发明者为我们准备了一个解决方案:友元关系。

友元关系是类(或函数)之间的一种特殊关系。这种关系不仅允许友元访问对方的public方法和属性,还允许友元访问对方的protected和private方法和属性。就像现实世界一样,类的友元是它自己挑选的。

声明一个友元关系的语法很简单,只要在类声明的某个地方加上一条

// 友元类
friend class MyFriend;
// 友元函数
friend int my_fun(void);

语句就行了。这条语句的位置无关紧要,放在public, protected或private段落里都行。