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: