在某些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍然阻止一般的访问。
友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。
1. 友元的声明以关键字friend开始。
2. 只能出现在类定义的内部。
3. 可以出现在类中的任何地方,不是授予友元关系的那个类成员,所以不受其声明出现部分的访问控制影响。
友元关系是授予的,不对称的,友元会破坏封装。
#include <iostream>
using namespace std;
class X;
class Y
{
public:
void f(X*);
//void b(X);
private:
X* pX;
};
/*
void Y::b(X a)
{
}
*/
class X{
public:
void initialize();
friend void g(X*, int); // global friend
friend void Y::f(X*); // class member friend
friend class Z; // entire class is a friend
friend void h();
private:
int i;
};
void X::initialize()
{
i = 0;
}
void g(X *x, int i)
{
x->i = i;
}
void Y::f(X *x)
{
x->i = 47;
}
class Z
{
public:
void initialize();
void g(X *x);
private:
int j;
};
void Z::initialize()
{
j = 99;
}
void Z::g(X *x)
{
x->i += j;
}
void h()
{
X x;
x.i = 100; // direct data manipulation
}
int main()
{
X x;
Z z;
z.g(&x);
}