生活中你的家有客厅(public),有你的卧室(private)
客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你自己能进去
但是呢,你也可以允许你的好友进去
在程序里,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元技术
友元的目的就是让一个函数或者类访问另一个类中的私有成员
友元的关键字为:friend

友元的三种实现:

  • 全局函数做友元
  • 类做友元
  • 成员函数做友元

    示例1:全局函数做友元

    1. #include <iostream>
    2. using namespace std;
    3. class Building
    4. {
    5. friend void building(Building* build); //友元全局函数的声明
    6. public:
    7. Building()
    8. {
    9. sittingroom = "客厅";
    10. bedroom = "卧室";
    11. }
    12. string sittingroom;
    13. private:
    14. string bedroom; //private成员变量
    15. };
    16. void building(Building *build) //全局函数
    17. {
    18. cout << "好基友正在访问:" << build->sittingroom << endl;
    19. cout << "好基友正在访问:" << build->bedroom << endl; //访问building类内private成员变量
    20. }
    21. int main()
    22. {
    23. Building b;
    24. building(&b);
    25. system("pause");
    26. }
    结果:
    image.png

    示例2:类做友元

    #include <iostream>
    using namespace std;
    class Building
    {
    friend class Goodgay;              //类做友元的实现方式:  friend class 友元类名
    public:
      Building()
      {
          this->sittingroom = "客厅";   //为成员变量赋值
          this->bedroom = "卧室";       //为成员变量赋值
      }
      string sittingroom;
    private:                              //私有的成员变量
      string bedroom;    
    }; 
    class Goodgay                         //构建Goodgay类
    {
    public:                               
      Building* building;              //构建Building类的一个指针去接收Building在栈上开辟的空间
      Goodgay()
      {
          building = new Building;     //在栈上开辟一个Building类的空间
      }
      void Visit()
      {
          cout << "好基友正在访问:" << building->sittingroom << endl;       //访问public成员变量
          cout << "好基友正在访问:" << building->bedroom << endl;           //访问private成员变量
      }
    };
    int main()
    {
      Goodgay gg;
      gg.Visit();
      system("pause");
    }
    
    结果:
    image.png

    示例3:成员函数做友元

    #include <iostream>
    using namespace std;
    class Building;
    class Goodgay
    {
    public:
      Goodgay();
      void visit();
      void visit2();
      Building* building;
    };
    class Building
    {
      friend void Goodgay::visit2();
    public:
      Building();
      string m_Sittingroom;
    private:
      string m_Bedroom;
    };
    Building::Building()
    {
      m_Sittingroom = "客厅";
      m_Bedroom = "卧室";
    }
    Goodgay::Goodgay()
    {
      building = new Building;
    }
    void Goodgay::visit()
    {
      cout << "visit函数正在访问:" << building->m_Sittingroom << endl;
    }
    void Goodgay::visit2()
    {
      cout << "visit函数正在访问:" << building->m_Bedroom << endl;
    }
    int main()
    {
      Goodgay g;
      g.visit();
      g.visit2();
      system("pause");
    }
    
    结果:
    image.png
    下边的代码有问题,暂未找到问题所在,需要改动!
    原因找到:Goodgay已经引用了Building,然后在Building又做了引用声明,属于互相引用,所以产生错误! ```cpp

    include

    using namespace std; class Building {
    friend void Goodgay::visit(); //Goodgay成员函数visit()访问Building下的private私有成员变量的声明 public: Building() {
      this->sittingroom = "客厅";
      this->bedroom = "卧室";
    
    } string sittingroom; private: string bedroom; };

class Goodgay { public: Building* building; Goodgay() { building = new Building; } void visit() { cout << “好基友正在访问:” << building->sittingroom << endl; cout << “好基友正在访问:” << building->bedroom << endl; } }; int main() { Goodgay gg; gg.visit(); system(“pause”); } ```