类允许其他类或者函数访问它的非公有成员,但我们需要将访问类非公有成员的其他类或者函数成为它的友元。
一、友元函数
如果类想要把一个函数作为他的友元,只需要增加一条以 friend 关键字开始的函数声明语句即可。
例如:
class A{
friend void fri_fun(A);
private:
int a=9;
};
void fri_fun(A aa){
cout<<aa.a<<endl;
}
在代码中,我们在类 A 中声明了函数 fri_fun ,并以 friend 关键字加以说明,此时我们可以在函数 fri_fun 中访问 A 类的私有成员。
友元的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明。如果我们希望类的用户能过调用某个友元函数,那么我们就必须在友元声明之外再专门对函数进行声明。
一些编译器允许在尚无友元函数的初始声明的情况下就调用它。即使这样,也最好还是提供一个独立的函数声明。
二、友元类
友元类也需要 friend 关键字加以说明。
例如:
class B{
friend class A;
int s=9;
};
class A {
public:
void aa(B c) {
cout << c.s << endl;
}
};
类 A 的成员函数可以访问类 B 的私有成员。
注意:如果我们把类 A 放在类 B 的前边,此时编译会出错,因为在编译类 A 时,我们并没有定义类 B。
我们也可以将成员函数作为另一个类的友元,我们将上一个代码更改,仅仅让类 A 的成员函数 aa 可以访问类 B 的私有成员