1.友元成员函数
先上代码
#include <iostream>class B;//由于类B的定义在类A之后,所以用到类B的声明时,使用前向声明
class A{
private:
void func()
{
std::cout << "A::func()" << std::endl;
}
public:
void call_func_of_B(B &b);//可以使用类B定义指针,引用,对象,因为上文有前向声明
};
class B{
private:
void func()
{
std::cout << "B::func()" << std::endl;
}
friend void A::call_func_of_B(B &b);//友元声明将类A的成员函数声明为类B的友元函数
};
//定义类A成员函数
void A::call_func_of_B(B &b)
{
b.func();
}
//友元函数,将A类中的成员函数申明为B类中的友元函数,则此成员函数不仅拥有A类的所有变量的访问权限,而且拥有了B类的的有成员变量的访问权。
同理,我们也可以将类B的成员函数声明为类A的友元函数,则此成员函数同样拥有了两个类所有成员变量的访问权。
2.友元类
友元除了前面讲过的函数以外,友元还可以是类,即一个类可以作另一个类的友元。当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数。
使用友元类时注意:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
总结起来:
(1)友元关系不可以继承,但对已有的方法来说访问权限不改变。
(2)如果改写基类的方法则访问权限改变
(3)友元关系不具有传递性
若类B是类A的友元,类C是B的友元,类C不一定是类A的友元。
#include <iostream>
using namespace std;
class CObj
{
public:
CObj() : mX(0), mY(0) {}
friend class CFriend; //类CFriend 申明为CObj的友元,
private:
void PrintData() const
{
cout << "mX = " << mX << endl
<< "mY = " << mY << endl;
}
int mX;
int mY;
};
class CFriend
{
public:
CFriend(int x, int y)
{
mObj.mX = x; //直接调用类CObj的私有数据成员
mObj.mY = y;
}
void ShowData() const
{
mObj.PrintData(); //直接调用类CObj的私有成员函数
}
private:
CObj mObj;
};
int main()
{
CFriend one(3, 4);
one.ShowData();
return 0;
}
执行结果:
mX = 3
mY = 4
//如上,在类CObj中,类CFriend 申明为CObj的友元,则在类CFriend中能直接访问类CObj,中的所有成员,包括成员变,成员函数,私有的也可以。。