一个类 A 可以将另一个类 B 声明为自己的友元,类 B 的所有成员函数就都可以访问类 A 对象的私有成员。在类定义中声明友元类的写法如下:
friend class 类名;
友元类B类的所有成员函数,都能访问A类对象的私有成员;
类 A 将类 B 声明为友元类,则类 B 最好从逻辑上和类 A 有比较接近的关系。例如上面的例子,CDriver 代表司机,CCar 代表车,司机拥有车,所以 CDriver 类和 CCar 类从逻辑上来讲关系比较密切,把 CDriver 类声明为 CCar 类的友元比较合理;
友元类的关系是单向的,不是双向的,如果声明了A是B的friend,不等于B是A的friend;
friend的关系不能传递。即类 A 是类 B 的友元,类 B 是类 C 的友元,并不能导出类 A 是类 C 的友元;
friend函数不是类的成员函数,却可以访问该类的私有和保护成员,从严格意义上来说,这不符合面向对象原则;
因此friend函数的使用时存在争议的,且容易被勿用;
#include <iostream>
using namespace std;
class A
{
private:
int a;
friend class B; //友元类,即B类的所有成员函数都能访问A类对象的私有成员
};
class B
{
private:
int b;
public:
void printFunc()
{
A a;
a.a=10;
b=20;
cout<< "a.a + b = " << a.a+b << endl;
}
}
int main()
{
B b;
b.f();
return 0;
}