目录
4.4 友元
4.4.1 全局函数做友元
4.4.1 类做友元
4.4.1 成员函数做友元
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;
}