友元
比如:客厅(Public)什么人都能进,但是卧室(Private)只有你可以,偶尔允许好朋友进去。
友元的目的:让一个函数或者类访问另一个类中的私有成员
关键字为:friend
友元的三种实现:
- 全局函数做友元
- 类做友元
- 成员函数做友元
全局函数做友元
#include <iostream>
#include <string>
using namespace std;
// 全局函数做友元
class Building
{
friend void goodFriend(Building*building);
public:
Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
void goodFriend(Building*building)
{
cout<<"好朋友正在访问:"<<building->m_SittingRoom<<endl;
cout<<"好朋友正在访问:"<<building->m_BedRoom<<endl;
}
void test()
{
Building building;
goodFriend(&building);
}
int main()
{
test();
system("pause");
return 0;
};
运行结果:
好朋友正在访问:客厅
好朋友正在访问:卧室
请按任意键继续. . .
类做友元 和 成员函数做友元
#include <iostream>
#include <string>
using namespace std;
// 类做友元和成员函数做友元
class Building;
class GoodFriend
{
public:
GoodFriend();
void visit();
Building * building;
};
class Building
{
//friend class GoodFriend; // 类做友元
friend void GoodFriend::visit(); // 成员函数做友元
public:
Building();
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
// 类外写成员函数
Building::Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
GoodFriend::GoodFriend()
{
building = new Building;
}
void GoodFriend::visit()
{
cout<<"好朋友正在访问:"<<building->m_SittingRoom<<endl;
cout<<"好朋友正在访问:"<<building->m_BedRoom<<endl;
}
void test()
{
GoodFriend Jane;
Jane.visit();
}
int main()
{
test();
system("pause");
return 0;
};
运行结果:
好朋友正在访问:客厅
好朋友正在访问:卧室
请按任意键继续. . .
说一点,上面那代码,如果顺序改变了,会报错:
expected unqualified-id before ‘(’ token
class GoodFriend
class Building
{};
class GoodFriend
{};
思路也许在这里:
C++的一个编绎错误引发的问题分析