目录
4.4 友元
生活中你的家有客厅(Public),有你的卧室(Private)
客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去但是呢,你也可以允许你的好闺蜜好其友进去。
在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类 访问另一个类中私有成员
友元的关键字为friend
友元的三种实现
- 全局函数做友元
- 类做友元
- 成员函数做友元
4.4.1 全局函数做友元
#include <iostream>
#include <string>
using namespace std;
// 全局函数做友元
class Building {
friend void goodbye(Building* building);// 声明友元函数
public:
Building(){
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
// 全局函数声明
void goodbye(Building* building) {
cout << "好朋友全局函数,正在访问:" << building->m_SittingRoom << "!" << endl;
cout << "好朋友全局函数,正在访问:" << building->m_BedRoom << "!" << endl;
}
void test() {
Building building;// 实例化对象
goodbye(&building);// 调用全局函数
}
int main() {
test();
return 0;
}
4.4.1 类做友元
#include <iostream>
#include <string>
using namespace std;
// 类做友元
class Building {
friend class goodGirl;// 声明goodGirl类做为友元类;声明后,goodGirl类可以访问Building类的私有成员变量和函数
public:
Building();
//Building(){
// m_SittingRoom = "客厅";
// m_BedRoom = "卧室";
//}
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
class goodGirl {
public:
goodGirl();
void visit();// 参观函数;访问友元类Building的成员函数
Building* building;// 声明一个指向Building类的指针作为友元
};
//类外写成员函数
Building::Building(){
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
goodGirl::goodGirl(){
building = new Building();// 实例化一个Building类对象作为友元
}
void goodGirl::visit(){
cout << "好朋友,欢迎来到" << building->m_SittingRoom << ",看看" << building->m_BedRoom << "吧!" << endl;
}
int main(){
goodGirl girl;
girl.visit();
return 0;
}
4.4.1 成员函数做友元
#include <iostream>
#include <string>
using namespace std;
// 成员函数作为友元
class Building; // 声明Building类
class goodGay {
public:
goodGay();// 构造函数声明
void visit();// 让visit函数,作为goodGay的友元,访问Building中的私有成员
void visit_2(); // 让visit_2函数,作为goodGay的友元,不能访问Building中的私有成员
Building* building;
};
class Building {
friend void goodGay::visit(); // 声明visit函数为goodGay的友元,访问Building中的私有成员
public:
Building();// 构造函数声明
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
// 类外实现成员函数
Building::Building() {
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
goodGay::goodGay() {
building = new Building();// 实例化Building类
}
void goodGay::visit() {
cout << "visit访问客厅:" << building->m_SittingRoom << endl;
cout << "visit访问卧室:" << building->m_BedRoom << endl;
}
void goodGay::visit_2() {
cout << "访问客厅:" << building->m_SittingRoom << endl;
}
int main() {
goodGay g;
g.visit(); // 访问客厅, 访问卧室
g.visit_2(); // 访问卧室,不能访问私有成员
return 0;
}