友元的定义
类的私有属性,也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
目的让一个函数或者类访问一个类中私有成员
关键字friend
例如,你的家里有客厅(public),卧室(private),客厅所有的客人都可以进去,但是卧室是私有的只有自己可以进去,但是,你也允许你的好闺蜜好基友一起进去
友元的三种实现
全局函数做友元
class Building
{public : Building():SittingRoom("客厅"),BedRoom("卧室")
string SittingRoom;
private : string BedRoom;
};
void goodGay(Building *building)
{
cout<<"好基友全局函数正在访问"<<Building->m_sittingRoom;
cout<<"好基友全局函数正在访问"<<Building->m_BedRoom;//报错,因为访问了私有属性
}
想要全局函数也访问私有属性,只需要在类内最上面以friend声明允许访问的全局函数即可,将上面的错误代码进行修改,得到下面的代码
class Building
{
friend void goodGay(Building *building);
public : Building():SittingRoom("客厅"),BedRoom("卧室")
string SittingRoom;
private : string BedRoom;
};
void goodGay(Building *building)
{
cout<<"好基友全局函数正在访问"<<Building->m_sittingRoom;
cout<<"好基友全局函数正在访问"<<Building->m_BedRoom;//报错,因为访问了私有属性
}
可以看到,在类的最上面加上friend void goodGay(Building *building);,说明goodGay是我的好朋友,可以访问我的私有成员
类做友元
让一个类也可以访问另一个类的私有内容
class Building
{
public : Building():SittingRoom("客厅"),BedRoom("卧室")
string SittingRoom;
private : string BedRoom;
};
class GoodGay{
public : void visit();//参观函数,访问下方的building的私有属性
GoodGay():building(new Building())
void visit()
{
cout<<"好基友全局函数正在访问"<<this->building->m_sittingRoom;
cout<<"好基友全局函数正在访问"<<this->uilding->m_BedRoom;//报错
Building * building;
}
想要goodgay类做友元,只需要声明他是一个友元类即可,在building类中加添friend class Goodgay;
class Building
{
friend class Goodgay;
public : Building():SittingRoom("客厅"),BedRoom("卧室")
string SittingRoom;
private : string BedRoom;
};
class GoodGay{
public : void visit();//参观函数,访问下方的building的私有属性
GoodGay():building(new Building())
void visit()
{
cout<<"好基友全局函数正在访问"<<this->building->m_sittingRoom;
cout<<"好基友全局函数正在访问"<<this->uilding->m_BedRoom;
Building * building;
}
成员函数做友元
在上面的场景中,假设我的goodgay函数里有两个函数visit1()和visit2(),我现在只想让visit1()可以访问私有属性,不想让visit2()访问私有属性,应该怎么办
我们需要用friend声明对应作用域下的某个函数
比如 friend void GoodGay::visit();
即可