我们知道,C++引进了三个关键字:private、protected、public来作为访问说明符。private修饰的成员只能被成员函数访问,而在类外,任何人都不能访问;public修饰的成员可以被所有人访问。
有没有一种机制,实现一种折中的选择,使得类里面的私有成员,只能让类外的部分函数访问,而不是全部呢?C++ 为了解决这个问题,引入了友元这个概念。
可以这样理解:如果不是friend的话,程序员就不能从类外“破门而入”,进而看到并不是想让所有人都看到的东西。
全局函数,另一个类中的成员函数,甚至整个类都可以声明为某一个类的friend。
类控制着哪些代码可以访问它的成员。声明友元就是其中的一种控制。
#include <iostream> using namespace std; class B; class C { public: void print(); }; class A { private: int i; public: A(int j=1):i(j){} friend void print(); //global function friend class B; friend void C::print(); }; void C::print() { A a; cout<<"friend C.print() is visiting"<<a.i<<endl; } class B { private: A a; public: void print() { cout<<"friend B is visiting"<<a.i<<endl; } }; void print() { A a; cout<<a.i<<endl; } int main() { print(); //gloabl B b; b.print(); C c; c.print(); return 0; }
输出:
可以发现,从类外是看不出哪个函数或类是哪个类的友元,要找A类的友元,只能从A类的成员声明中去寻找原型。