1. 什么是友元
一般情况下,类的 private 和 protected 成员只能由该类的成员函数访问,外部函数或其它类的函数是不能通过这个类的对象访问private 和 protected 成员。
friend 只是一个标识,它将外部函数或外部其它类的函数当成了这个类的成员函数对待。这样外部函数或外部其它类的函数就可以直接访问这个类的private 和 protected 成员(相当于对外部开了一个后门,破坏private 和 protected 的限制,让其变成了public)。
friend声明可以放在类声明的私有或公共部分;放在哪儿都无所谓。可以使一个类的所有函数成为另一个类的友函数。
2. 示例
class B;
class A
{
public:
A() {};
~A() {};
private:
int a = 1;
protected:
int m = 10;
friend int add(A& a, B& b);
//类B的所有成员函数想访问类A的私有或受保持成员
friend B;//或 friend class B;加不加class无所谓
};
class B
{
public:
B() {};
~B() {};
void assign(A& a)
{
a.m = 100;
}
private:
int b = 2;
protected:
int m = 0;
friend int add(A& a, B& b);
};
//外部C风格函数要访问类的私有和保护成员,分别在类A和B中标明friend即可。
int add(A& a, B& b)
{
b.m = 0;
b.assign(a);
return a.a + b.b;
}
int _tmain(int argc, _TCHAR* argv[])
{
A a;
B b;
int sum = add(a,b);
system("pause");
return 0;
}