什么是友元,作用是什么?
封装是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 }