在程序里,有些私有属性也想要内外特殊的一些函数或者类进行访问,就需要用到友元技术。
友元的目的就是让一个函数或者类访问另一个类中私有成员
友元关键字: friend
友元的三种实现:
- 全局函数做友元
- 类做友元
- 成员函数做友元
- 全局函数做友元
当内外函数访问类内私有成员属性时,编译器会提示错误,如果想要类外函数访问类内私有成员。需要在类中进行友元函数的声明
代码演示:
//建筑物类 class Building { //goodGay全局函数时Building好朋友,可以访问Building中的私有成员 friend void goodGay(Building* building); public: Building() { m_SittingRoom = "客厅"; m_BedRoom = "卧室"; } public: string m_SittingRoom; //客厅 private: string m_BedRoom; //卧室 }; //全局函数 void goodGay(Building *building) { cout << "好基友全局函数正在访问:" << building->m_SittingRoom << endl; cout << "好基友全局函数正在访问:" << building->m_BedRoom << endl; } void test01() { Building building; goodGay(&building); } int main() { test01(); return 0; }
2.类做友元
class Building; class GoodGay { public: GoodGay(); void visit();//参观函数 访问Building中的属性 Building* building; }; class Building { //GoodGay类是本类的好朋友,可以访问本类中私有成员 friend class GoodGay; public: Building(); public: string m_SittingRoom; private: string m_BedRoom; }; //类外写成员函数 Building::Building() { m_SittingRoom = "客厅"; m_BedRoom = "卧室"; } GoodGay::GoodGay() { //创建建筑物对象 building = new Building; } void GoodGay::visit() { cout << "好基友类正在访问:" << building->m_SittingRoom << endl; cout << "好基友类正在访问:" << building->m_BedRoom << endl; } void test01() { GoodGay gg; gg.visit(); } int main() { test01(); return 0; }
3.成员函数做友元
class Building; class GoodGay { public: GoodGay(); void visit(); //让visit函数可以访问Building中私有成员 void visit2(); //让visit2函数不可以访问Building中私有成员 Building* building; }; class Building { friend void GoodGay::visit(); public: Building(); public: string m_SittingRoom; //客厅 private: string m_BedRoom; //卧室 }; //类外实现成员函数 Building::Building() { m_SittingRoom = "客厅"; m_BedRoom = "卧室"; } GoodGay::GoodGay() { building = new Building; } void GoodGay::visit() { cout << "visit 函数正在访问:" << building->m_SittingRoom << endl; cout << "visit 函数正在访问:" << building->m_BedRoom << endl; } void GoodGay::visit2() { cout << "visit2 函数正在访问:" << building->m_SittingRoom << endl; //cout << "visit 函数正在访问:" << building->m_BedRoom << endl; } void test01() { GoodGay gg; gg.visit(); gg.visit2(); } int main() { test01(); return 0; }