C++ 核心 "友元"

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

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

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

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

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

 

友元的关键字为 ==friend==

友元的三种实现

  • 全局函数做友元

  • 类做友元

  • 成员函数做友元

1.全局函数做友元

 1 class home {
 2     
 3     //告诉编译器girlfriend全局函数 是room的friend,可以访问类中的私有内容。
 4     friend void girlfriend(home &room);    
 5     public:
 6         home() {
 7             this->m_SittingRoom = "客厅";
 8             this->m_BedRoom = "卧室";
 9         }
10 
11     public:
12         string m_SittingRoom; //客厅
13     private:
14         string m_BedRoom; //卧室
15 };
16 
17 //&引用 用.访问;      *指针用->访问
18 void girlfriend(home &room){
19     cout << "女朋友(全局函数)在我家:" << room.m_SittingRoom << endl;
20     cout << "女朋友(全局函数)在我家:" << room.m_BedRoom << endl;
21     
22 }
23 
24 void test01(){
25     home me;
26     girlfriend(me);
27 }
28 int main(){
29 
30     test01();
31     system("pause");
32     return 0;
33 }

 

2.类做友元(友元类)

 1 class Building;
 2 class Goodgay{
 3     
 4     public:
 5         Goodgay();
 6         
 7         void visit();//参观函数 访问Building中的属性
 8         Building *building;    
 9 };
10 
11 class Building{
12     //Goodgay类是本类的好朋友,可以访问本类中的私有成员
13     friend class Goodgay; //★★★
14 public:
15     Building();
16     public:
17         string m_SittingRoom;
18     private:
19         string m_BedRoom;
20 };
21 
22 //类外写成员函数
23 Building::Building(){
24     
25     this->m_BedRoom = "卧室"; //
26     m_SittingRoom = "客厅";
27 }
28 //类外写成员函数
29 Goodgay::Goodgay(){
30     //创建建筑物对象
31     building = new Building;  //类里面的指针一定要分配内存
32     
33 }
34 
35 void Goodgay::visit(){
36     cout << "好基友正在访问:" << building->m_SittingRoom << endl;
37     cout << "好基友正在访问:" << building->m_BedRoom << endl;
38     
39 }
40 
41 void test01(){
42     Goodgay p1;
43     p1.visit();
44 }
45 
46 int main(){
47 
48     test01();
49     system("pause");
50     return 0;
51 }

 

3.成员函数做友元

class Building;
class Goodgay{
    public:
        Goodgay();
        void visit1(); //让visit1函数可以访问到building中的私有成员
        void visit2(); //让visit2函数不可以访问到building中的私有成员
        
        Building *building;        
};

class Building{
    //friend class Goodgay; //类做友元
    
    //告诉编译器 Goodgay类下的visit成员函数作为本类的好朋友,可以访问私有成员
    friend void Goodgay::visit1(); //成员函数做友元
    public:
        Building();
        
    public:
        string m_Sittingroom;
        
    private:
        string m_Bedroom;
};

//类外实现所有成员函数
Building::Building(){
    this->m_Sittingroom = "客厅";
    m_Bedroom = "卧室";
}

Goodgay::Goodgay(){
    building = new Building;
}

void Goodgay::visit1(){
    cout << "visit1 函数正在访问:" << building->m_Sittingroom << "\n" << endl;
    cout << "visit1 函数正在访问:" << building->m_Bedroom << "\n" << endl;    
}

void Goodgay::visit2(){
    cout << "visit2 函数正在访问:" << building->m_Sittingroom << endl;
    //cout << "visit2 函数正在访问:" << building->m_Bedroom << endl;    
}
void test01(){
    Goodgay p1;
    p1.visit1();
    p1.visit2();

}

int main(){

    test01();
    system("pause");
    return 0;
}

 

posted @ 2022-04-18 20:30  xiaoxie001  阅读(38)  评论(0编辑  收藏  举报