生活中你的家有客厅(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