friend机制允许一个类将对其非公有成员的访问权授予指定的函数或类。
1 友元的声明以关键字friend开始,只能出现在类定义的内部,但可以出现在类中的任何 地方(因为友元函数是类外的函数,所以它的声明可以放在类的私有段或共有段没有区 别,不是这个类的类成员所以它的访问控制不受出现在什么地方的影响) 2.友元关系是授予的, 3 友元关系是不对称的。 4.友元会破坏封装性(友元函数友元类能访问被授予友元的那个类的私有变量),尽量 不使用友元函数,除非不得已的情况下才使用友元函数。优点是:在实现类之间的数据 共享时,减少系统开销,提高效率,表达简单清晰。
2.友元函数的参数:
因为友元函数没有this指针,则参数有三种情况: 1 访问非static成员时,需要对象做参数,(也可以没有参数,在内部再定义一个 对象)。 2 访问static成员时,不需要对象做参数。,因为static成员是共用的不属于哪一个 对象,存储在.data段和全局变量的存储类相同 3 如果做参数的对象是全局对象,则不需要对象做参数。
3.友元函数的调用
可以直接调用友元函数,不需要通过通过对象或指针。
这里写代码片
class A{
public:
void initialize(void);
friend void g(A *, int);//函数g是类A的友元函数
friend void B::f(A *);//B的成员函数f是类B的友元函数
friend class C;//类C是类A的友元,使用单个声明使C类的所有成员函数为A类的
//友元,它提供一种类之间合作的一种方式,使类C的对象具有类A和类C的功能
friend void h(void);//函数h是A的友元函数
private:
int i;
};
void A::initializevoid)
{
i = 0;
}
void g(A *x, int j)//函数g是类A的友元函数
{
x->i = j;
}
void B::f(A *x)//B的成员函数f是类B的友元函数
{
x->i = 50;
}
class C{
public:
void initialize();
void g(A *x);
private:
int k;
}
void C::initialize()
{
j = 99;
}
void C::g(A *x)
{
x->i += k;//借助友元,在C类的成员函数g(A *x)中,借助A的对象,直接访问A的
//私有变量
}
void h() //函数h是A的友元函数
{
A x;//也可以没有参数,在内部再定义一个对象
x.i = 100;
}
void main(void)
{
A *a;
g(a, 10);//友元函数直接调用,参数是一个对象
h();//友元函数直接调用,没有参数,但是内部定义了一个被授予友元的那个类的对象
C c;//C类是A的友元类
c.g(a);//借助友元,在C类的成员函数g(A *x)中,借助A的对象,直接访问A的
私有变量)
}