/* 生活中,你的家有客厅(public),有你的卧室(private) 客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去。 但是呢,你也可以允许你的好闺蜜好基友进去。
在程序里,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术。
友元的目的就是让一个函数或者类访问另一个类中的私有成员
友元的关键字为:friend
友元的三种实现:
1.全局函数做友元 2.类做友元 3.成员函数做友元
*/
1.全局函数做友元
#include "pch.h" #include <iostream> #include <string> using namespace std; class building { //goodgay全局函数是building好朋友,可以访问building中私有成员。 friend void goodgay(building *building); //构造函数赋初值 public: building() { m_sittingroon = "客厅"; m_bedroon = "卧室"; } public: string m_sittingroon;//客厅 private: string m_bedroon;//卧室 }; //全局函数 void goodgay(building *building) { cout << "全局函数正在调用客厅" << building->m_sittingroon << endl; cout << "全局函数正在调用卧室" << building->m_bedroon << endl; } void test01() { building building; goodgay(&building); } int main() { test01(); }2.类做友元
#include "pch.h" #include <iostream> #include <string> using namespace std; //类做友元 class goodgay { public: goodgay(); public: void vist();//参观函数,访问building 中的属性 building* building;//这个重要 }; class building { friend class goodgay;//类做友元 public: building();//构造函数类外实现 public: string m_sittingroom; private: string m_bedroom; }; //类外写成员构造函数 building::building() {//前面的意思是作用于building 下, m_sittingroom = "客厅"; m_bedroom = "卧室"; } // goodgay::goodgay() { //创建建筑物对象 //building = new building;//报错了 } void goodgay::vist() { } int main() { std::cout << "Hello World!\n"; }3.成员函数做友元
#include "pch.h" #include <iostream> #include <string> using namespace std; class Building; class Goodgay { public: Goodgay(); void vist();//可以访问building的私有成员 void vist2();//不可以访问building的私有成员 Building * building; }; class Building { //告诉编译器,Goodgay类下的vist成员函数作为本类的好朋友,可以访问私有成员 friend void Goodgay::vist(); public: Building();//构造函数 public: string m_sitting; private: string m_bedroom; }; //类外实现构造函数 Building::Building() { m_sitting = "客厅"; m_bedroom = "卧室"; } Goodgay::Goodgay() { building = new Building;//即创建Building对象的堆区,并用指针维护着, } //类外实现成员函数 void Goodgay::vist() { cout << "正在访问" << building->m_sitting << endl; cout << "正在访问" << building->m_bedroom << endl; } void Goodgay::vist2() { cout << "正在访问" << building->m_sitting << endl; cout << "正在访问" << building->m_bedroom << endl;//不可访问,报错 } //全局函数 void test01() { Goodgay good; good.vist(); } int main() { test01(); }