友元

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

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

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

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

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

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

友元的三种实现

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

4.4.1 全局函数做友元

将全局函数的定义复制到类括号中的最上方然后在函数定义前加friend

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 class building
 5 {
 6     //goodgay全局函数是building的好朋友,可以访问Building 中的私有成员
 7     friend void goodgay(building* Building);
 8 public:
 9      building()
10     {
11         m_sittingroom = "客厅";
12         m_badroom = "卧室";
13     }
14 public:
15     string m_sittingroom;//客厅
16 private:
17     string m_badroom;
18 };
19 //全局函数
20 void goodgay(building* Building)
21 {
22     cout << "好基友全局函数 正在访问 :" << Building->m_sittingroom << endl ;
23     cout << "好基友的函数 正在访问 :" << Building->m_badroom;
24 }
25 int main()
26 {
27     building Building;
28     goodgay(&Building);
29 }

 类做友元:

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 //类做友元
 5 class Building;
 6 class goodgay
 7 {
 8 public:
 9     goodgay();
10 public:
11     void visit();//参观函数 访问Building中的属性
12     Building* building;
13 };
14 class Building
15 {
16     //goodgay类是本类的好朋友可以访问本类的私有成员
17     friend class goodgay;
18 public:
19     Building();
20 public:
21     string m_sittingroom;//客厅
22 private:
23     string m_badroom;//卧室
24 };
25 //类外写成员函数
26 Building::Building()
27 {
28     m_sittingroom = "客厅";
29     m_badroom = "卧室";
30 }
31 goodgay::goodgay()
32 {
33     //创建一个建筑物的对象
34     building = new Building;//new在堆区分配了地址给Building类goodgay作用域下的指针函数*building
35     //*building = &Building;//类前面不能用&,因为没用分配地址
36 }
37 void goodgay::visit()
38 {
39     cout << "好基友的类正在访问 :" << building->m_sittingroom << endl;
40     cout << "好基友的类正在访问 :" << building->m_badroom << endl;
41 }
42 void test01()
43 {
44     goodgay gg;
45     gg.visit();
46 }
47 int main()
48 {
49     test01();
50 }

 

 成员函数做友元:

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 class Building;
 5 class goodgay
 6 {
 7 public:
 8     goodgay();
 9     void visit();//让成员函数visit 可以访问Building中的私有内容
10     void visit2();//成员函数visit2 不可以访问Building中的私有内容
11     Building* building;
12 };
13 class Building
14 {
15     //告诉编译器 goodgay类下的visit成员函数作为本类的好朋友可以访问本类的私有权限
16     friend void goodgay::visit();//不加goodgay::就是class Building下的局部函数
17 public:
18     Building();
19 public:
20     string m_sittingroom;//客厅
21 private:
22     string m_bedroom;//卧室
23 };
24 //类外实现成员函数
25 Building::Building()
26 {
27     m_sittingroom = "客厅";
28     m_bedroom = "卧室";
29 }
30 goodgay::goodgay()
31 {
32     building = new Building;
33 }
34 void goodgay::visit()
35 {
36     cout << " visit正在访问你的 : " << building->m_sittingroom << endl;
37     cout << " visit正在访问你的 : " << building->m_bedroom << endl;
38 }
39 void goodgay::visit2()
40 {
41     cout << "visit2正在访问你的 : " << building->m_sittingroom << endl;
42 }
43 void test01()
44 {
45     goodgay gg;
46     gg.visit();
47     gg.visit2();
48 }
49 int main()
50 {
51     test01();
52 }

 

posted on 2022-09-02 18:07  在野武将  阅读(31)  评论(0)    收藏  举报