友元的目的:允许一个函数或者类访问另一个类中私有成员
友元的关键字:friend
友元的三种实现
- 全局函数做友元
- 类做友元
- 成员函数做友元
全局函数做友元
只要在类内的最上端写上friend 函数声明,就可以实现全局函数做友元。
class Building
{
//告诉编译器goodGuy全局函数是类Building的好友,可以访问Building中私有成员
friend void goodGuy(Building& building);
public:
//构造函数
Building()
{
m_sittingRoom = "客厅";
m_bedRoom = "卧室";
}
string m_sittingRoom; //客厅
private:
string m_bedRoom; //卧室
};
//全局函数
void goodGuy(Building& building)
{
cout << "好基友全局函数正在访问:" << building.m_sittingRoom << endl;
cout << "好基友全局函数正在访问:" << building.m_bedRoom << endl;
}
void test1()
{
Building building;
goodGuy(building);
}
类做友元
只要在类内的最上端写上friend 类声明,就可以实现类做友元。
class Building
{
//GoodGuy类是本类的好友,可以访问本类中的私有成员
friend class GoodGuy;
public:
Building()
{
m_sittingRoom = "客厅";
m_bedRoom = "卧室";
}
string m_sittingRoom; //客厅
private:
string m_bedRoom; //卧室
};
class GoodGuy
{
public:
GoodGuy()
{
build = new Building; //new 类名 表示创建一个该类的对象并且返回对象的指针
}
void visit()//参观函数访问Building中的属性
{
cout << "好基友类正在访问:" << build->m_sittingRoom << endl;
cout << "好基友类正在访问:" << build->m_bedRoom << endl;
}
Building* build;
};
void test1()
{
GoodGuy gg;
gg.visit();
}
成员函数做友元
注意:在写代码时发现只有在类外去定义该类的构造函数和成员函数时,程序运行才不报错,要是在类内定义构造函数和成员函数时,程序运行会报错。
在类GoodGuy上方要写上Building类的声明,否则在执行Building* build时会报错,class GoodGuy要放在class Building前面,否则提示“GoodGuy”: 不是类或命名空间名称。
class Building;
class GoodGuy
{
public:
GoodGuy();
void visit();//让visit函数可以访问Building中的私有成员
void visit2(); //让visit2函数不可以访问Building中的私有成员
Building* build;
};
class Building
{
//告诉编译器 GoodGuy类下的visit成员函数作文本类的好友,可以访问私有成员
friend void GoodGuy::visit();
public:
Building();
string m_sittingRoom; //客厅
private:
string m_bedRoom; //卧室
};
//类外实现成员函数
Building::Building()
{
m_sittingRoom = "客厅";
m_bedRoom = "卧室";
}
GoodGuy::GoodGuy()
{
build = new Building;
}
void GoodGuy::visit()//让visit函数可以访问Building中的私有成员
{
cout << "visit函数正在访问:" << build->m_sittingRoom << endl;
cout << "visit函数正在访问:" << build->m_bedRoom << endl;
}
void GoodGuy::visit2()//让visit2函数不可以访问Building中的私有成员
{
cout << "visit函数正在访问:" << build->m_sittingRoom << endl;
//cout << "visit函数正在访问:" << build->m_bedRoom << endl;
}
void test1()
{
GoodGuy gg;
gg.visit();
gg.visit2();
}