前言
在有些时候,你希望你创建的类中的某些成员是私有的,让外部的代码无法直接访问它,但是你又希望某些特殊的外部代码能够直接访问它,所以C++提供了友元的功能,让你可以通过友元直接访问到这个类的所有成员。
友元的关键字为
friend
友元有三种实现
- 全局函数做友元
- 成员函数做友元
- 类做友元
全局函数做友元
#include<iostream>
using namespace std;
class A
{
friend void printM(A* a);//声明void printM(A* a)函数是A类的友元函数
private:
int m = 1;
};
void printM(A* a)
{
cout << a->m << endl;//友元函数void printM(A* a)就可以访问A类中的私有成员了
}
int main()
{
A* a = new A();
printM(a);
}
输出结果:
1
可见全局函数void printM(A* a)在A类中声明friend void printM(A* a)后,其就可以访问A类中的所有成员(无论访问权限如何都可以)。(此时,A类的私有方法其实也可以被void printM(A* a)访问,你可以试试)
成员函数做友元
#include <iostream>
#include <string>
using namespace std;
class B;
class A
{
public:
void printM(B* b);
};
class B
{
friend void A::printM(B* b);//声明A类的printM(B* b)函数是B类的朋友,可以访问B类的私有成员
private:
int m=6;
};
void A::printM(B* b)//在类体外定义A::printM(B* b)
{
cout << b->m << endl;
}
int main()
{
A* a = new A();
B* b = new B();
a->printM(b);
return 0;
}
输出结果:
···
6
···
可见A类的成员函数void printM(B* b)在B类中声明其是B类的友元后,就可以访问B类的所有成员(无论访问权限如何都可以)。(此时,B类的私有方法也可以被A类的void printM(B* b)访问,你可以试试)
类做友元
#include <iostream>
#include <string>
using namespace std;
class B;
class A
{
public:
void printM(B* b);
};
class B
{
friend class A;//声明A类是B类的朋友,那么A类的所有方法都可以访问B类的私有成员
private:
int m=6;
void Bprint()
{
cout << "Bprint" << endl;
}
};
void A::printM(B* b)//在类体外定义A::printM(B* b)
{
cout << b->m << endl;
b->Bprint();
}
int main()
{
A* a = new A();
B* b = new B();
a->printM(b);
return 0;
}
输出结果:
6
Bprint
可见A类做B类的友元时,B类的所有成员无论访问权限如何都可以被A类访问。