Class Member Functions and Classes as Friends

Class member functions can be declared as friends in other classes. Consider the following example:

class B;
class A
{
    int Func1( B& b ) ;
    int Func2( B& b ) ;
};

class B
{
private:
    int _b;
    friend int A::Func1( B& );   //  Grant friend access to one
                                //   function in class B.
};
 int A::Func1( B& b ) { return b._b; } //  OK: this is a friend.
 int A::Func2( B& b ) { return b._b; } //  Error: _b is a private member.

In the preceding example, only the function A::Func1( B& ) is granted friend access to class B. Therefore, access to the private member _b is correct in Func1 of class A but not in Func2.

Suppose the friend declaration in class B had been:

friend class A;

In that case, all member functions in class A would have been granted friend access to class B. Note that “friendship” cannot be inherited, nor is there any “friend of a friend” access. Figure 10.2 shows four class declarations: Base, Derived, aFriend, and anotherFriend. Only class aFriend has direct access to the private members of Base (and to any members Base might have inherited).

Figure 10.2   Implications of friend Relationship