为什么会出现友元呢?我们在类中定义成员变量的时候一般将成员变量定义为私有的,这就使得在类的外部是无法访问这些私有的成员变量的,只能通过类的接口成员函数来访问。如果只是通过成员函数来访问效率不会太高,当然还有其他的一些因素,使得我们需要直接来访问类中的私有成员。这个时候友元出现了,友元分为友元函数和友元类,声明为一个类的友元函数,在这个函数中我们就可以访问类的私有成员了。当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数。友元的弊端是破坏了类的分装性和数据的隐藏性。好了,看看代码中怎么使用吧。

//友元函数测试
#include <iostream>

using namespace std;

class Test
{
private:
	int x;
public:
	Test(int i):x(i){};
	//这里的访问权限写什么都是无关紧要的,因为友元函数不是成员函数
private:
	friend int getX(const Test t);
};

//前边没有类的作用域::,也不需要写friend
int getX(const Test t)
{
	//不能这样return x直接访问x,而是通过对象去访问它的x,因为友元不是成语函数,没有this指针,所以你不知道
	//调用的是哪个对象的x,只能将对象传递过来然后访问它的成员变量
	return t.x;
}
//友元类测试
#include <iostream>

using namespace std;

class A
{
	//这里的访问权限是无关紧要的
private:
	//将B声明为A的友元,则B中就可以访问A中的私有成员了,B中的函数都将成员A中的友元函数
	friend class B;
private:
	int x;
	int getX(){return x;};
public:
	A(int i){x=i;};
};
//友元类测试
#include <iostream>
#include "A.h"

using namespace std;

class B
{
public:
	void getA_x(A a);
};

void B::getA_x(A a)
{
	//B中的函数都是A的友元函数,所以可以访问A中的成员变量
	cout<<a.x<<endl;
	//访问A中的成员函数
	cout<<a.getX()<<endl;
}
//在main函数中测试一下
#include "Test.h"
#include "B.h"

int main()
{
	Test t(10);
	//友元函数的调用和普通函数的调用是相同的
	cout<<getX(t)<<endl;

	B b;
	A a(20);
	b.getA_x(a);
	return 0;
}