文章目录
- 11 友元
- 11.1 全局函数做友元
- 11.2 友元类
- 11.3 成员函数做友元
11 友元
让我们引入一个例子来讲述友元
是什么。
生活中你的家有客厅,有卧室,客厅所有来的客人都可以进去,但是你的卧室是私有的。对于认识的人来说你可以允许它进去,但是对于陌生人你就不是很欢迎了。
同样地,我们把这个例子引申到类上,那么我们的友元就变成了,一个类允许另外一个类拥有访问自己的私有权限。
如果要指定友元类,只需加上关键字friend。我们来看一下它的三种实现方式:
- 全局函数做友元
- 类做友元
- 成员函数做友元
11.1 全局函数做友元
让我们看一下全局函数做友元的简单用法:
#include <iostream>
using namespace std;
#include <string>class Building
{friend void goodGay(Building& building);//!侬,指定这个函数为Building的好朋友
public:Building(){m_SittingRoom = "客厅";m_Bedroom = "卧室";};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();
}
out:
11.2 友元类
让我们在来看看友元类是怎么一回事,这个实际上不必多说,只要你试着敲一下下面的代码,即可体会其思想。
#include <iostream>
using namespace std;
#include <string>class Building;class GoodGay
{
public:GoodGay();void visit();//参观函数 访问Building中的属性Building* building;
};class Building
{friend class GoodGay;
public:Building();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();
}
out:
11.3 成员函数做友元
同样地,成员函数做友元和类做友元也是大同小异,如下所示:
#include <iostream>
using namespace std;class Building;class GoodGay
{
public:GoodGay();void visit1();//这个函数可以访问Building的私有成员void visit2();//这个函数不可以访问Building的私有成员Building* building;
};class Building
{friend void GoodGay::visit1();
public:Building();string m_SittingRoom;//客厅private:string m_BedRoom;//卧室
};//类外实现成员函数
Building::Building()
{m_SittingRoom = "客厅";m_BedRoom = "卧室";
}GoodGay::GoodGay()
{building = new Building;
}void GoodGay::visit1()
{cout << "visit1 函数正在访问:" << building->m_BedRoom << endl;cout << "visit1 函数正在访问:" << building->m_SittingRoom << endl;
};void GoodGay::visit2()
{// cout << "visit2 函数正在访问:" << building->m_BedRoom << endl;cout << "visit2 函数正在访问:" << building->m_SittingRoom << endl;
};void test01()
{GoodGay gg;gg.visit1();gg.visit2();
}int main()
{test01();
}
out: