• 【C++友元】


    友元

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

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

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

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

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

    友元的关键字friend

    友元的三种实现

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

    全局函数做友元

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

    在友元全局函数中,我们可以访问另一个类的所有成员

    简而言之,正常来说一个函数不能够去访问这个私有变量

    但是我们将这个全局函数的代码第一行前面加上friend关键字放在类中(放在哪都行不受私有公有的限制一般放在最前面)

    这个全局函数就能够访问这个类的私有部分了

    类做友元

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

    需要注意的是:

    1. 友元关系不能被继承
    2. 友元关系不是相互的,例如在代码中,builing中添加的友元类goodgay,goodgay可以访问building的私有部分,building不可以访问goodgay的私有部分。

    成员函数做友元

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

    其中Building;goodGay声明和定义的顺序如下:

    class Building;
    
    class goodGay;
    
    class Building{friend void goodGay};
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    Go Slice 排除异己
    QtCreator5.15.0编译全过程记录
    (非)首次出现bash:command not found情况详解
    PHREEQC建模及典型案例解析与高阶拓展应用【反向“编译”、“玩转”后处理技术、GibbsStudio和PhreePlo方法】
    【自学】C++Primer 变量和基本类型
    [附源码]Python计算机毕业设计Django小型银行管理系统
    6.30模拟赛总结
    P1068 [NOIP2009 普及组] 分数线划定
    k8s 常用命令
    Docker+github actions部署前端项目
  • 原文地址:https://blog.csdn.net/m0_63746713/article/details/133755266