友元的目的是让一个函数或类 访问另一个类中的私有成员
友元关键词为 friend
三种实现:
1、全局函数作友元
class building
{
friend void goodfriend(building* building);//加入前缀friend,使该全局函数可以访问building中的私有属性
public:
building()
{
sittingroom = "客厅";
bedroom = "卧室";
}
public:
string sittingroom;
private:
string bedroom;
};
//全局函数
void goodfriend(building* building)
{
cout << "全局函数正在访问" << building->sittingroom << endl;
cout << "全局函数正在访问" << building->bedroom << endl;//访问私有属性
}
void test1() {
building building;
goodfriend(&building);
}
int main() {//主函数返回值为整型
test1();
system("pause");//暂停系统命令
return 0;//退出程序
}
2、类作友元
class Building;
class goodGay
{
public:
goodGay();
void visit();
private:
Building* building;
};
class Building
{
//告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容
friend class goodGay;
public:
Building();
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom;//卧室
};
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
goodGay::goodGay()
{
building = new Building;
}
void goodGay::visit()
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
cout << "好基友正在访问" << building->m_BedRoom << endl;
}
void test01()
{
goodGay gg;
gg.visit();
}
int main() {
test01();
system("pause");
return 0;
}
3、成员函数作友元
class Building;
class goodfriend
{
public:
goodfriend();
void visit();//让visit函数可以访问Building中的私有成员
void visit2();//正常不能访问Building中的私有成员
Building* building;//创建一个指向Building类对象的指针,指针的名字叫building
//由于这里Building是前置声明,因此没有实现不能用对象进行指向,因此只能用指针
};
class Building
{
//利用友元使goodfriend下的visit函数可以访问Building中的私有属性
friend void goodfriend::visit();
public:
Building();
public:
string sittingroom;
private:
string bedroom;
};
Building::Building()
{
sittingroom = "客厅";
bedroom = "卧室";
}
goodfriend::goodfriend()
{
building = new Building;
}
void goodfriend::visit()//可以访问私有属性
{
cout << building->sittingroom << endl;
cout << building->bedroom << endl;
}
void goodfriend::visit2()//不可访问私有属性
{
//cout << building->bedroom << endl;
}
void test1()
{
goodfriend gg;
gg.visit();
gg.visit2();
}
int main() {
test1();
system("pause");
return 0;
}