什么是友元,作用是什么?

封装是C++的三大特性之一,封装后类里的成员就有访问限制符了,有public,protected,private访问权限了,类里 的private 私有成员,类外是不可以访问,那么当类外的函数或者另一个类想访问该类的私有成员时,怎么办?

  那就用到友元的技术了,友元能够让一个函数或者类访问另一个类的私有成员,友元的关键字为==friend==

  友元的三种实现:

    1.全局函数做友元(全局函数要访问类中的私有成员)

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

 

    2.类做友元(类访问另一个类中的私有成员)

 

 1 #include<iostream>
 2 using namespace std;
 3 
 4 //建筑物类
 5 class Building
 6 {
 7     //告诉编译器 GoodGay是Building类的好朋友,可以访问到Building类中的私有成员
 8     friend class GoodGay;
 9 public:
10     Building();
11 public:
12     string m_SittingRoom; //客厅
13 private :
14     string m_BedRoom;  //卧室
15 };
16 Building::Building()
17 {
18     m_SittingRoom = "客厅";
19     m_BedRoom = "卧室";
20 }
21 
22 //好基友类,想访问Building里的私有内容
23 class GoodGay
24 {
25 public:
26     GoodGay();
27     void visit();
28 private:
29     Building* building;
30 };
31 GoodGay::GoodGay()
32 {
33     building = new Building();
34 }
35 void GoodGay::visit()
36 {
37     cout << "好基友类正在访问:" << building->m_SittingRoom << endl;
38     cout << "好基友类正在访问:" << building->m_BedRoom << endl; //不在建筑类加friend GoodGay就不能访问私有成员
39 }
40 int main()
41 {
42     GoodGay gg;
43     gg.visit();
44 
45     return 0;
46 }

 

    3.成员函数做友元(让类中的成员函数去访问另一个类的私有成员)

 1 #include <iostream>
 2 
 3 using namespace  std;
 4 
 5 class Building;
 6 //好基友类,只想让GoodGay里的成员函数visit()访问Building类的私有成员
 7 class GoodGay
 8 {
 9 public:
10     GoodGay();
11     void visit(); //只让visit函数作为Building的好朋友,可以访问Building中的私有内容
12     void visit2();  //不可以访问
13 private:
14     Building* building;
15 };
16 
17 class Building
18 {
19     friend void GoodGay::visit();
20 public:
21     Building();
22 public:
23     string m_SittingRoom;
24 private:
25     string m_BedRoom;
26 };
27 Building::Building()
28 {
29     this->m_SittingRoom = "客厅";
30     this->m_BedRoom = "卧室";
31 }
32 
33 GoodGay::GoodGay()  //等Building类构造完后,再对GoodGay进行构造
34 {
35     building = new Building;
36 }
37 void GoodGay::visit()
38 {
39     cout << "好基友类的成员函数visit正在访问" << building->m_SittingRoom << endl;
40     cout << "好基友类的成员函数visit正在访问" << building->m_BedRoom << endl;
41 }
42 void GoodGay::visit2()
43 {
44     cout << "好基友类的成员函数visit2正在访问" << building->m_SittingRoom << endl;
45     //cout << "好基友类的成员函数visit2正在访问" << building->m_BedRoom << endl; //visit2不是友元不能访问私有成员
46 }
47 int main()
48 {
49     GoodGay gg;
50     gg.visit();
51 
52     return 0;
53 }

 

posted @ 2023-08-27 00:48  潘阳399  阅读(115)  评论(0编辑  收藏  举报