在我们的日常成活中,肯定离不开一个词,那就是特殊化。而在我们的程序中,有时也需要这样的特殊化,比如,有些私有属性也想让类外的一些函数进行访问,这是就要用到友元技术。
友元的目的就是让一个函数或者类,访问另一个类中私有成员,关键字为 friend
友元的三种实现
1、全局函数做友元
2、类做友元
3、成员函数做友元
1、全局函数做友元
class Building
{
friend void goodgay(Building& building);
//这样全局函数goodGay就可以访问Building的私有成员
public:
Building1()
{
m_BedRoom = "卧室";
m_SittingRoom = "客厅";
}
string m_SittingRoom;
private:
string m_BedRoom;
};
//全局函数
void goodgay(Building1& building)
{
cout << building.m_SittingRoom << endl;
cout << building.m_BedRoom << endl;
}
2、类做友元
class Building;
class Goodgay
{
public:
Goodgay()
{
building = new Building;
}
void visit()
{
cout << building->m_SittingRoom << endl;
cout << building->m_BedRoom << endl;
}
Building* building;
};
class Building
{
friend class Goodgay;//goodGay 是友元,可以访问私有成员
public:
Building()
{
m_BedRoom = "卧室";
m_SittingRoom = "客厅";
}
string m_SittingRoom;
private:
string m_BedRoom;
};
3、成员函数做友元
class Building;
class Goodgay
{
public:
Goodgay()
{
building = new Building;
}
void visit1()//让visit1函数可以访问Building中的私有成员
{
cout << "visit1 正在访问 " << building->m_SittingRoom << endl;
cout << "visit1 正在访问 " << building->m_BedRoom << endl;
}
void visit2()//让visit2函数不可以访问Building中的私有成员
{
cout << "visit2 正在访问 " << building->m_SittingRoom << endl;
cout << "visit2 正在访问 " << building->m_BedRoom << endl;
}
Building* building;
};
class Building
{
friend void Goodgay::visit1();//告诉编译器Goodgay类下的visit1成员函数做友元
public:
Building()
{
m_BedRoom = "卧室";
m_SittingRoom = "客厅";
}
string m_SittingRoom;
private:
string m_BedRoom;
};