• 第十五章 类和对象——友元


    生活中你的家有客厅(Public),有你的卧室(Private)

    客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去

    但是呢,你也可以允许你的好闺蜜好基友进去。

    在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术。

    友元的目的就是让一个函数或者类 访问另一个类中私有成员。

    友元的关键字为 friend

    友元的三种实现

    • 全局函数做友元

    • 类做友元

    • 成员函数做友元

    一、全局函数做友元

    1.  class Building
    2.  {
    3.   //告诉编译器 goodGay全局函数 是 Building类的好朋友,可以访问类中的私有内容
    4.   friend void goodGay(Building * building);
    5.  ​
    6.  public:
    7.  ​
    8.   Building()
    9.   {
    10.   this->m_SittingRoom = "客厅";
    11.   this->m_BedRoom = "卧室";
    12.   }
    13.  ​
    14.  ​
    15.  public:
    16.   string m_SittingRoom; //客厅
    17.  ​
    18.  private:
    19.   string m_BedRoom; //卧室
    20.  };
    21.  ​
    22.  ​
    23.  void goodGay(Building * building)
    24.  {
    25.   cout << "好基友正在访问: " << building->m_SittingRoom << endl;
    26.   cout << "好基友正在访问: " << building->m_BedRoom << endl;
    27.  }
    28.  ​
    29.  ​
    30.  void test01()
    31.  {
    32.   Building b;
    33.   goodGay(&b);
    34.  }
    35.  ​
    36.  int main(){
    37.  ​
    38.   test01();
    39.  ​
    40.   system("pause");
    41.   return 0;
    42.  }

    二、类做友元

    1.  class Building;
    2.  class goodGay
    3.  {
    4.  public:
    5.  ​
    6.   goodGay();
    7.   void visit();
    8.  ​
    9.  private:
    10.   Building *building;
    11.  };
    12.  ​
    13.  ​
    14.  class Building
    15.  {
    16.   //告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容
    17.   friend class goodGay;
    18.  ​
    19.  public:
    20.   Building();
    21.  ​
    22.  public:
    23.   string m_SittingRoom; //客厅
    24.  private:
    25.   string m_BedRoom;//卧室
    26.  };
    27.  ​
    28.  Building::Building()
    29.  {
    30.   this->m_SittingRoom = "客厅";
    31.   this->m_BedRoom = "卧室";
    32.  }
    33.  ​
    34.  goodGay::goodGay()
    35.  {
    36.   building = new Building;
    37.  }
    38.  ​
    39.  void goodGay::visit()
    40.  {
    41.   cout << "好基友正在访问" << building->m_SittingRoom << endl;
    42.   cout << "好基友正在访问" << building->m_BedRoom << endl;
    43.  }
    44.  ​
    45.  void test01()
    46.  {
    47.   goodGay gg;
    48.   gg.visit();
    49.  ​
    50.  }
    51.  ​
    52.  int main(){
    53.  ​
    54.   test01();
    55.  ​
    56.   system("pause");
    57.   return 0;
    58.  }

    三、成员函数做友元

    1.  class Building;
    2.  class goodGay
    3.  {
    4.  public:
    5.  ​
    6.   goodGay();
    7.   void visit(); //只让visit函数作为Building的好朋友,可以发访问Building中私有内容
    8.   void visit2();
    9.  ​
    10.  private:
    11.   Building *building;
    12.  };
    13.  ​
    14.  ​
    15.  class Building
    16.  {
    17.   //告诉编译器 goodGay类中的visit成员函数 是Building好朋友,可以访问私有内容
    18.   friend void goodGay::visit();
    19.  ​
    20.  public:
    21.   Building();
    22.  ​
    23.  public:
    24.   string m_SittingRoom; //客厅
    25.  private:
    26.   string m_BedRoom;//卧室
    27.  };
    28.  ​
    29.  Building::Building()
    30.  {
    31.   this->m_SittingRoom = "客厅";
    32.   this->m_BedRoom = "卧室";
    33.  }
    34.  ​
    35.  goodGay::goodGay()
    36.  {
    37.   building = new Building;
    38.  }
    39.  ​
    40.  void goodGay::visit()
    41.  {
    42.   cout << "好基友正在访问" << building->m_SittingRoom << endl;
    43.   cout << "好基友正在访问" << building->m_BedRoom << endl;
    44.  }
    45.  ​
    46.  void goodGay::visit2()
    47.  {
    48.   cout << "好基友正在访问" << building->m_SittingRoom << endl;
    49.   //cout << "好基友正在访问" << building->m_BedRoom << endl;
    50.  }
    51.  ​
    52.  void test01()
    53.  {
    54.   goodGay  gg;
    55.   gg.visit();
    56.  ​
    57.  }
    58.  ​
    59.  int main(){
    60.      
    61.   test01();
    62.  ​
    63.   system("pause");
    64.   return 0;
    65.  }

  • 相关阅读:
    如何在测试/线上环境页面访问本地接口?
    高级程序员项目经理写好代码必备的三条基本素质;以及代码的现象和本质问题解读;
    2-网络架构和Netty系列-Java和IO网络模型
    SAP PO运维(二):XML消息归档和删除配置
    电商数据|电商API接口|电商数据分析都会用到的接口不用再找了
    如何使用Jekyll在GitHub Pages上搭建网站(个人博客)
    【自动驾驶模拟器AirSim快速入门 | 04】推理预测及模拟器运行
    迎接“全全闪”时代 星辰天合发布星海架构和星飞产品
    mmap文件内存映射
    我从未结束的Java之旅(二)
  • 原文地址:https://blog.csdn.net/qq_26126363/article/details/133561443