在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类 访问另一个类中私有成员
友元的关键字为 friend
友元的三种实现
-
全局函数做友元
-
类做友元
-
成员函数做友元
#include"cf_13.h"
class Home;
class VisitorsA;
class VisitorsB
{
public:
VisitorsB();
~VisitorsB() {}
void visit02();
private:
Home* home_02;
};
class Home
{
// 告诉编译器 visitors全局函数 是 Home类的好朋友,可以访问类中的私有内容
friend void visitors(Home* obj);
// 类友元
friend class VisitorsA;
// 成员函数友元
friend void VisitorsB::visit02();
public:
Home()
{
this->settingRoom = "客厅";
this->bedroom = "睡房";
}
~Home() {}
string settingRoom;
private:
string bedroom; // 范围私有属性,需要友元
};
// 全局函数通过友元访问类的私有函数
void visitors(Home* obj)
{
cout <<"全局函数正访问客厅:" << obj->settingRoom << endl;
cout <<"全局正访问睡房:" << obj->bedroom << endl;
}
class VisitorsA
{
public:
VisitorsA(){}
~VisitorsA() {}
void visit(Home* obj)
{
cout << "类友元访问客厅:" << obj->settingRoom << endl;
cout << "类友元访问睡房:" << obj->bedroom << endl;
}
};
// 一定要注意顺序,VisitorsB要写类外函数
VisitorsB::VisitorsB()
{
home_02 = new Home;
}
void VisitorsB::visit02()
{
cout << "成员函数友元访问客厅:" << home_02->settingRoom << endl;
cout << "成员函数友元访问睡房:" << home_02->bedroom << endl;
}
void cf_13_test_01()
{
Home home_01;
visitors(&home_01);// 全局函数访问
VisitorsA va1;
va1.visit(&home_01);// 类友元访问
VisitorsB va2;
va2.visit02();// 成员函数友元访问
}