友元是为了对c++封装性进行补充,只在类中定义,用修饰符friend修饰。众所周知,当一个类把数据成员申明为private时,除了该类的成员函数外,其他函数包括全局函数和其他类的成员函数都无法通过该类的对象访问这些private数据。一个合适的解决办法是给该类定义一个成员函数:
DataType getprivate()
{ return private data;}
然后通过类的对象的成员函数去访问private的数据。
但是如果要获取的private数据个数比较多而且类型又各不相同,这个办法就比较复杂。这时候我们就引入了友元的概念。可以这么理解友元,友元是在某个类中赋予某个外部函数访问本类私有数据成员的权限。这个外部函数可以是全局函数,也可以是其他类的成员函数。如果是全局函数,友元的定义如下:
void func(Myclass &m);//这个友元函数的参数必须得是想要访问的类
class Myclass
{
friend void func(Myclass &m);
public:
...
private:
...
};
这样,外部全局函数func就可以访问Myclass的私有数据成员了。
如果是其他类的成员函数想要访问Myclass的私有数据成员呢?把其他类定义为友元类就可以啦。
class Other
{...};
class Myclass
{
friend class Other;
public:
...
private:
...
};
友元这个关系有两个特性:
1.友元关系不可传递,b是a的友元,c是b的友元,不意味着c是a的友元类。
2.友元关系是单向的