friend
- 任何class都可以将其他类或者函数指定为朋友(friend);
- friend具备了与类成员函数相同的访问权限,可以访问类的private member;
- 声明:只需要在函数原型前加上关键字friend;
- 这份声明可以出现在class定义的任意位置上,不受private和public的影响;
- 想要将数个重载函数声明为某个类的friend,所有的重载函数前都要加friend;
//operator*()这个非成员函数在两个类里声明为friend
//它可以直接访问Triangular类和Triangular_iterator类的私有成员
//如下
class Triangular{
friend int operator*(const Triangular_iterator &rhs);
//...
};
class Triangular_iterator{
friend int operator*(const Triangular_iterator &rhs);
//...
};
class Triangular{
friend int Triangular_iterator::operator*();
//...
};
- 类与类之间也可以建立friend关系,借此A类里的所有成员函数都成为了B类的friend,反之同理;
以这种形式来声明类之间的friend,就不需要在friend声明之前先显现class的定义了。
class Triangular{
friend class Triangular_iterator;
//...
};
注意无需建立友谊的情况:
class Triangular{
public:
static int elem_size(){return _elems.size();}
static int max_elems(){return _max_elems;}
//...
};
//以上类定义了public里的成员函数,用到了以下类的成员函数的定义里
//友谊不再必要
//即无需friend void Triangular_iterator::check_integrity();
inline void Triangular_iterator::check_integrity()
{
if(_index>=Triangular::max_elems())
{
throw iterator_overflow();
}
if(_index>=Triangular::elems_size())
{
Triangular::gen_elements(_index + 1);
}
}
友谊的建立,通常是为了效率考虑的。比如只希望进行某个数据成员的读取和写入,那么为他提供具有public访问权限的inline函数,就是建立友谊的另一个替代方案。