在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
友元的目的 就是让一个函数或者类 访问另一个类中的私有成员
友元的关键字为 friend
友元的三种实现
- 全局函数做友元
- 类做友元
- 成员函数做友元
1 全局函数做友元(代码)
class Building
{
friend void laowang1(Building* _building);
friend void laowang2(Building& _building);
friend void laowang3(Building _building);
public:
Building() {
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
string m_SittingRoom; // 客厅
private:
string m_BedRoom;
};
void laowang1(Building* _building)
{
cout << "laowang1正在放在访问 "<< _building->m_SittingRoom<<endl;
cout << "laowang1正在放在访问 " << _building->m_BedRoom<<endl;
}
void laowang2(Building& _building)
{
cout << "laowang1正在放在访问 " << _building.m_SittingRoom << endl;
cout << "laowang1正在放在访问 " << _building.m_BedRoom << endl;
}
void laowang3(Building _building)
{
cout << "laowang1正在放在访问 " << _building.m_SittingRoom << endl;
cout << "laowang1正在放在访问 " << _building.m_BedRoom << endl;
}
int main() {
Building building;
laowang1(&building);
laowang2(building);
laowang3(building);
}
2.类做友元(代码)
class Building
{
friend class laoWang;
public:
Building();
string m_SittingRoom; // 客厅
private:
string m_BedRoom;
};
Building::Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
class laoWang
{
public:
laoWang();
void visit();
Building* building;
private:
};
void laoWang::visit()
{
cout << "老王正在访问" << building->m_SittingRoom<<endl;
cout << "老王正在访问" << building->m_BedRoom <<endl;
}
laoWang::laoWang()
{
// 创建建筑物对象
building = new Building;
}
void test()
{
laoWang lw;
lw.visit();
}
int main()
{
test();
}
3.成员函数做友元
class Building;
class LaoWang
{
public:
LaoWang();
void visit1(); //让visit1()函数 可以 访问Building中的私有成员
void visit2(); //让visit2()函数 不可以 访问Building中的私有成员
Building *building;
private:
};
class Building
{
// 告诉编译器,LaoWang类下的visit1()函数是Building类的好朋友,可以访问Building的私有成员
friend void LaoWang::visit1();
public:
Building();
string m_SittingRoom; //客厅
private:
string m_BedRoom; //卧室
};
LaoWang::LaoWang()
{
building = new Building;
}
void LaoWang::visit1()
{
cout << "隔壁老王LaoWang类中的visit1()函数正在访问:" << building->m_SittingRoom << endl;
cout << "隔壁老王LaoWang类中的visit1()函数正在访问:" << building->m_BedRoom << endl;
}
void LaoWang::visit2()
{
cout << "隔壁老王LaoWang类中的visit2()函数正在访问:" << building->m_SittingRoom << endl;
//cout << "隔壁老王LaoWang类中的visit2()函数正在访问:" << building->m_BedRoom << endl; //错误!私有属性不可访问
}
Building::Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
void test()
{
LaoWang lw;
lw.visit1();
lw.visit2();
}
int main()
{
test();
return 0;
}