在前面我们讲解了成员属性有两种权限设置:公共权限(public)、保护权限(protected)和私有权限(private)
但是在程序里,有些私有属性也想让类外特殊的一些函数或者类进行访问。
那我们该怎样去处理呢?
现在我们设想一种环境,在你的房间,有柜子放一些书籍,大家都可以看(public),但是有个柜子放你写的日记,一般不给人看(private)。但是你特别好的朋友(friend)来了,这些内容他是可以看的。
这就是我们要学习的友元,关键字为 friend
设计他的目的就是让一个函数或者类访问另一个类中私有成员。
友元具有以下三点实现
1、全局函数做友元
2、类做友元
3、成员函数做友元
- 下面我将用代码实现前两种情况,第三种实现,可以自己试着尝试,如果不懂得可以私信发代码!
- 示例1:
-
#include<iostream> using namespace std; #include<string> class Building { //goodFriend全局函数是Building好朋友,可以访问私有成员 friend void goodFriend(Building *building); public: Building() { m_SittingRoom = "客厅"; m_BedRoom = "卧室"; } public: string m_SittingRoom;//客厅 private: string m_BedRoom;//卧室 }; //全局函数 void goodFriend(Building *building) { cout << "访问好友的全局函数:" << building->m_SittingRoom << endl; cout << "访问好友的全局函数:" << building->m_BedRoom<< endl; } void test() { Building building; goodFriend(&building); } int main() { test(); system("pause"); return 0; }
示例2:
-
#include<iostream> using namespace std; #include<string> //类做友元 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 g; g.visit(); } int main() { test01(); system("pause"); return 0; }