2. 使其他类的成员函数成为友元
class Class1
{
public:
int counter;
public:
int AddCounter(Class1 *c1);
public:
Class1(int counter = 100):counter(counter){}
};
class Class2
{
private:
int SumCount(Class1 *c1, Class1 *c2)
{
return c1 -> counter + c2 -> counter;
}
friend int Class1::AddCounter(Class1 *c1);
};
int Class1::AddCounter(Class1 *c1)
{
return Class2().SumCount(c1, this);
}
Class1 *c1 = &Class1(200);
Class1 c2(300);
cout << c2.AddCounter(c1) << endl;
当我们将成员函数声明为友元时,函数必须用该函数所属的类名字加以限定。
3. 友元声明和作用域
必须先定义包含成员函数的类,才能将成员函数设为友元。另一方面,不必预先声明类和非成员函数来将它们设为友元。
友元声明将已命名的类或非成员函数引入到外围作用域中。此外,友元函数可以在类的内部定义,该函数的作用域扩展到包围该类定义的作用域。
class X
{
friend class Y;
friend void f(X &x){cout << "test X" << endl;}
};
class Z
{
public:
Y *ymem;
void g()
{
X x;
return f(x);
}
};
用友元引入的类名和函数(定义或声明),可以像预先声明的一样使用,但是是有条件的,一个类的友元函数必须有该类的形参。
4.重载函数与友元关系
类必须将重载函数集中每一个希望设为友元的函数都声明为友元。