友元函数提供了一种类外访问类的私有成员的方式。这种方式很明显破坏了类的封装性。但是有时候我们确实有这种需求。为此C++就提供了友元函数和友元类。本文说明的是友元函数。
需要强调的是,友元函数不是类的函数,我们只是在类内做了一个声明,表示这个函数是该类的友元函数。既然友元函数不是该类的成员函数,那么理所当然的不具备this指针,不能被子类继承。
友元函数实际上就像隔壁老王在你家开了个后门(而且是经过你允许的)。
友元函数的声明非常简单,因为它不是类的成员,你可以在类内的任何地方声明它。语法格式如下:
friend 返回值 函数名(参数列表);下面我们来看一个例子:
#include<iostream>
class CMan
{
friend void LaoWang(CMan& p); //友元函数
private:
int a;
int b;
public:
CMan(int a = 0, int b = 0);
void showMan();
};
void LaoWang(CMan& p); //声明函数LaoWang
CMan::CMan(int a, int b)
{
this->a = a;
this->b = b;
}
void CMan::showMan()
{
std::cout << "a:" << this->a << " b:" << this->b << std::endl;
}
void LaoWang(CMan &p)
{
p.a = 80;
p.b = 50;
}
int main()
{
CMan man(100, 100);
man.showMan();
LaoWang(man);
man.showMan();
return 0;
}调用结果如下:

可以看到,类的私有属性成员被更改了值。