生活中你的家有客厅(Publick), 有你的卧室(pravite)
客厅所有人都可以访问的, 卧室是私有的只有自己可以访问。
但是你也可以允许你自己的(好朋友或闺蜜或发小)进去访问。
在程序中,有一些私有的属性 也想让类外的一些特殊的函数访问,那么这就需要用到友元技术了
友元的目的是让一个函数或者类,访问另一个类中的私有成员。
友元的关键字为:friend
友元的三种实现:
1:全局函数做友元。
2:类做友元。
3:成员函数做友元。
若是A为类B的友元函数则A可以访问类B中的私有成员;
而B类却不能访问A;
示例: 1第一种情况 全局函数做友元
#include<iostream>#include<string>using namespace std;class Building{friend void test(Building &building);//声明此函数为这个类的友元函数 所以此函数就可以访问这个类的私有成员。public:Building(){parlou="客厅";bedroom="卧室";}string parlou;private:string bedroom;};//全局函数void test(Building &building){cout<<"你的好朋友全局函数正在访问你的:"<<building.parlou<<endl;cout<<"你的好朋友全局函数正在访问你的:"<<building.bedroom<<endl;}void test0(){Building p;test(p);return ;}int main(){test0();return 0;}
2:第二种情况 类做友元:
#include<iostream>#include<string>using namespace std;//class Building;class Building{friend class Goodbay;public:string parlou;Building();private:string bedroom;};class Goodbay{public:Goodbay();void visit();Building *building;};Building::Building(){parlou="客厅";bedroom="卧室";}Goodbay::Goodbay(){building= new Building;}void Goodbay::visit(){cout<<"你的好朋友正在参观 :"<<building->parlou<<endl;cout<<"你的好朋友正在参观 :"<<building->bedroom<<endl;}void show(){Goodbay p;p.visit();}int main(){show();return 0;}
3:成员函数做友元:
#include<iostream>#include<string>using namespace std;class Building;class GoodGay{public:GoodGay();void visit0();//可以访问building里面的私有成员 。void visit1();//不可以访问building里面的私有成员。Building *building;};class Building{//作用是告诉Building这是GoodGay类下的成员函数。friend void GoodGay::visit0();public:Building();string m_parlou;private:string m_bedroom;};Building::Building(){m_parlou="客厅";m_bedroom="卧室";}GoodGay::GoodGay(){building= new Building;}void GoodGay::visit0(){cout<<"零号正在访问你的:"<<building->m_parlou<<endl;cout<<"壹号正在访问你的:"<<building->m_bedroom<<endl;}void GoodGay::visit1(){cout<<"零号正在访问你的:"<<building->m_parlou<<endl;// cout<<"壹号正在访问你的:"<<building->m_bedroom<<endl;}void show (){GoodGay p;p.visit0();p.visit1();}int main(){show();return 0;}
网址1:
https://www.bilibili.com/video/BV1et411b73Z?p=118
网址2:
https://www.bilibili.com/video/BV1et411b73Z?p=119
网址3:
https://www.bilibili.com/video/BV1et411b73Z?p=120
