友元—关键字为 friend
在程序里,有些 私有属性 也想让类外特殊的一些函数或者类进行访问 --- 友元的目的就是让一个函数或者类 访问另一个类中私有成员
6.1、全局函数做友元
class Building
{
//该全局函数是Building类的友元函数,可以访问Building类中的私有成员
friend void goodFunc(Building * building);
public:
Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
string m_SittingRoom;
private:
string m_BedRoom;
};
//全局函数
void goodFunc(Building * building)
{
cout << "全局函数正在访问 " << building->m_SittingRoom << endl;
cout << "全局函数正在访问 " << building->m_BedRoom << endl;
}
void test01()
{
Building b;
goodFunc(&b);
}
运行结果:
6.2、类做友元
class Building
{
friend class GoodFriend;
public:
Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
string m_SittingRoom;
private:
string m_BedRoom;
};
class GoodFriend
{
public:
GoodFriend();
void GoodFriend::Visit()
{
cout << "Visit()正在访问:" << endl;
cout << "good friend is visiting " << building->m_SittingRoom << endl;
cout << "good friend is visiting " << building->m_BedRoom << endl;
}
private:
Building *building;
};
GoodFriend::GoodFriend()
{
building = new Building;
}
void test02()
{
GoodFriend gf;
gf.Visit();
}
运行结果:
6.3、成员函数做友元
class Building;
class GoodFriend
{
public:
GoodFriend();
void Visit();//该函数可以访问Building类中的私有成员,只让visit函数作为Building的好朋友
void Visit2();//该函数不能访问Building类中的私有成员
private:
Building *building;
};
class Building
{
friend void GoodFriend::Visit();
public:
Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
string m_SittingRoom;
private:
string m_BedRoom;
};
GoodFriend::GoodFriend()
{
building = new Building;
}
void GoodFriend::Visit()//该函数可以访问Building类中的私有成员,只让visit函数作为Building的好朋友
{
cout << "Visit()正在访问:" << endl;
cout << "good friend is visiting " << building->m_SittingRoom << endl;
cout << "good friend is visiting " << building->m_BedRoom << endl;
}
void GoodFriend::Visit2()//该函数不能访问Building类中的私有成员
{
cout << "Visit2()正在访问:" << endl;
cout << "good friend is visiting " << building->m_SittingRoom << endl;
//cout << "good friend is visiting " << building->m_BedRoom << endl;
}
void test03()
{
GoodFriend g;
g.Visit();
g.Visit2();
}
运行结果: