定义整个类为另外一个类的friend类型是非常容易的,我们可以这么编写:
class A
{
friend class B; //B has access to every member of A
//..
};
但是,在大多数例子中,我们并不推荐也不允许B中的每个成员函数无选择的进入A中的每个成员,不过你可以在B中定义一个单独的成员函数做为A的friend类型。
为了定义一个friend类型的成员函数,通常在关键字friend的后面提供成员函数的原形,看下面的例子:
class B;
class A
{
public:
int f(B&);
};
B在一开始就必须定义,因为成员函数A::f()要引用B,看下面这个例子:
class B
{
friend intA::f(B&); // friend member function
private:
intfunc();
};
注意到那些被称作访问指定词的键字不适用于friend的定义中,因此,下面的例子在语意上等价于先前的friend的定义方式。
class B
{
public: //has no effect on friend declarations
friend intA::f(B&);
//. . .
};
作为一种规则,我们必须阻止访问指定词出现在friend定义之前,因为它有可能给输入造成影响,而且对输出一点作用也没有。
你通常会访问一个非public的成员函数,在这个例子中成员函数A::f()调用b对象中private类型的成员函数,值得注意的是从A类中的其他成员函数调用b.func()将会引起编译错误。
intA::f(B& b)
{
return b.func(); //OK, A::f is a friend of B
}
end