概念
1:程序中,某个类的私有属性 可以让类外 一些特殊函数或者类进行访问,这个就是友元技术 。
2: 有元的关键字是 : friend。
3:友元的三种实现:
全局函数做友元
类做友元
成员函数做友元
1:全局函数做友元
案例:在类中直接在全局函数的声明添加 friend 即可。同时,不需要为其指定访问权限,直接放进去即可。
#include<iostream>
#include<string>
using namespace std;
class Building {
// 通过firend修饰,可以告诉编译器:goodGay是全局函数,可以访问 类 Building中的私有成员变量
friend void goodGay(Building* building);
public:
Building() {
this->m_settingRoom = "客厅";
this->m_bedRoom = "卧室";
}
string m_settingRoom; // 客厅
private:
string m_bedRoom; // 卧室
};
void goodGay(Building* build) {
cout << "访问:" << build->m_settingRoom << endl;
cout << "访问:" << build->m_bedRoom << endl;
}
int main() {
Building b;
goodGay(&b);
return 0;
}
根据运行结果可知:
有元全局函数可以访问到 私有成员变量。
2:类做友元
案例:我们假设goodGay类有一个Building类的私有成员变量 building,而Building类存在一些 私有成员,如果我们想让 goodGay对象能够 访问 Building类的私有成员。那么我们就需要让 goodGay称为 Building类的 友元。
#include<iostream>
#include<string>
using namespace std;
class Building;
class goodGay {
public:
goodGay();
void visit();
private:
Building* building;
};
class Building
{
// 告诉编译器 googGay类 Building类的 友元类,可以访问 Building类中的私有内容。
friend class goodGay;
public:
Building(); // 提供默认构造函数
string m_settingRoom; // 客厅
private:
string m_bedRoom; //卧室
};
// 通过 Building:: 作用域也可以访问 这些成员变量
Building::Building() {
this->m_bedRoom = "卧室";
this->m_settingRoom = "客厅";
}
// 构造函数:直接构造一个 Building对象
goodGay::goodGay() {
building = new Building();
}
void goodGay::visit() {
cout << "访问:" << building->m_settingRoom << endl;
// 因为 Building类声明 友元类 goodGay,所以可以访问 Building类中的私有成员属性 m_bedRoom
cout << "访问: " << building->m_bedRoom << endl;
}
int main() {
goodGay gg;
gg.visit();
}
运行结果可知:
goodGay是可以访问到 Building类中的私有成员变量。
3:成员函数做友元
案例:现在goodGay里面有两个成员函数 visit1 和 visit2 。如果我们只想让 visit1作为 Building的友元函数,------那么就可以将 visit1的声明直接 写到 Building类中。
#include<iostream>
#include<string>
using namespace std;
class Building;
class goodGay {
public:
goodGay();
void visit1();
void visit2();
private:
Building* building;
};
class Building {
// 告诉编译器 goodGay类中 visit1()成员函数是 Building类中的友元函数,可以访问其私有内容。
friend void goodGay::visit1();
public:
Building();
string m_SettingRoom;
private:
string m_bedRoom;
};
Building::Building() {
this->m_bedRoom = "卧室";
this->m_SettingRoom = "客厅";
}
goodGay::goodGay() {
building = new Building();
}
void goodGay::visit1() {
cout << "访问私有变量:" << building->m_bedRoom << endl;
}
void goodGay::visit2() {
cout << "访问公共变量:" << building->m_SettingRoom << endl;
}
int main() {
goodGay gg;
gg.visit1();
gg.visit2();
return 0;
}
从运行结果可知:友元成员函数可以访问对象的私有成员变量。