友元
生活中你的家有客厅(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 }