友元破环了对象的封装特性,分为外部函数友元、成员函数友元以及类友元。
一、外部函数友元
若外部函数想访问私有成员,把它设置成友元函数。示例如下:
class Int
{
private:
int value;
public:
Int(int x = 0) :value(x){}
~Int(){}
friend void fun(Int &it);
};
void fun(Int &it)
{
it.value = 10;
}
需注意的是,作为外部函数,本来没有this指针,意思在没有对象的情况下,无法讨论可访问性。
二、成员函数友元
希望通过类的成员方法访问另一个类的对象的私有成员。 示例如下:
class Int;
class Object
{
public:
void fun(Int& it);
};
class Int
{
private:
int value;
public:
Int(int x = 0) :value(x){}
~Int(){}
friend void Object::fun(Int& it);//告诉编译器是object的成员函数
};
void Object::fun(Int& it)
{
it.value=100;
}
int main()
{
Object obj;
Int a(0);
obj.fun(a);
return 0;
}
需要注意的是必须告诉编译器是哪一类的成员函数
三、类友元
某个类型所产生的对象可以访问另一个类型所产生的对象
class Int;
class Object
{
public:
void fun(Int& it);
};
class Int
{
friend class Object;
private:
int value;
public:
Int(int x = 0) :value(x){}
~Int(){}
};
void Object::fun(Int& it)
{
it.value=100;
}
总结:友元的特点1、单向 2、不具有传递性 3、不具有继承性