C++ 友元

我们知道,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类的成员声明中去寻找原型。 

原文地址:https://www.cnblogs.com/liujiangyi/p/2628790.html