protected: 与private:在类内的成员是可以访问 的,在类外的成员是不能访问的;
类中声明一个friend函数,则该函数可以访问本类中的protected与private成员;
友元函数:
1. 非成员函数:全局函数
声明在类体内,定义不要加friend;也可以在类体内定义,不要提前声明,被视为全局函数;
一个全局函数可以声明为多个类的友元;
void fun(A& a);
class B; // 提前声明,不能在A中生成对象B,要把B的完整声明放在A之前;也可以把B类放在一个.h文件中,用include 引进B
<span style="font-size:18px;">class A
{</span>
<span style="font-size:18px;">public:</span>
<span style="font-size:18px;"><span> </span>friend void fun(A& a);
private:
int a;
}</span>
2. 成员函数友元: 其它类中的成员函数
类中声明friend关键字,类外定义
<span style="color:#009900;">class B; </span> //A B写在一个文件里时, B类提前声明,A类中只能声明B为的对象指针不能定义B类的实体
class A
{
void fun() // 或是用B类的引用做形参
{
B *b; // 指针 <span style="color:#009900;"> // 在一个类里用到另一个类的指针或是引用,只要声明有这个类即可</span>
b->prival;
}
}
class B
{
public:
<span style="white-space:pre"> </span>friend void A::fun(); <span style="color:#009900;"> // 要在一个类里声明另一类的成员函数,要知道另一类的完整声明,即这里A放在B的前面</span>
<span style="color:#009900;"><span style="white-space:pre"> </span>// 所以A类放在B关的前面,或是包含A类的头文件</span>
private:
<span style="white-space:pre"> </span>int prival;
}
1. 要先声明友元函数所在的类,再声明包含friend关键字所在的类
2. 在一个类里只用到另一个类里的引用或是指针,只要声明即可,不要包含头文件.h(效率问题,引用不会开辟内存 空间)
友元类
A类中的成员函数都要访问B类中的非公有成员,可以把A类声明为B类的友元类
class A;
class B
{
friend A; // A声明为B的友元类 ,A可以调用B类中的私有变量
}
1. 友元类不具有传递性;
2. 友元关系是单向的;
3. 友元不受访问限定符的限制