目录
友元
生活中你的家有客厅(Public),有你的卧室(Private)
客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去
但是呢,你也可以允许你的好闺蜜好基友进去。
在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类 访问另一个类中私有成员
友元的关键字为 friend
友元的三种实现:
全局函数做友元
声明格式:friend + 全局函数返回值类型 + 全局函数名(全局函数形参);
示例:
#include <iostream>
using namespace std;
class Budling {
friend void goodGay(Budling& b1); //告诉编译器,这个全局函数可以访问类内的私有内容
public:
Budling()
{
m_SetingRoom = "客厅";
m_BadRoom = "卧室";
}
public:
string m_SetingRoom;
private:
string m_BadRoom;
};
void goodGay(Budling &b1)
{
cout << "访问" << b1.m_SetingRoom << endl;
cout << "访问" << b1.m_BadRoom<< endl;
}
void test01()
{
Budling B;
goodGay(B);
}
int main()
{
test01();
system("pause");
return 0;
}
类做友元
声明格式:friend + class + 类名;
示例:
#include <iostream>
using namespace std;
class Building {
//告诉编译器,这个类可以访问Building这个类中的私有属性
friend class goodGay;
public:
Building();
public:
string m_SetingRoom;
private:
string m_BadRoom;
};
class goodGay {
public:
goodGay();
void vist();
private:
Building *building;
};
Building::Building()
{
m_SetingRoom = "客厅";
m_BadRoom = "卧室";
}
goodGay::goodGay()
{
building = new Building;
}
void goodGay::vist()
{
cout << "正在访问:" << building->m_SetingRoom << endl;
cout << "正在访问:" << building->m_BadRoom << endl;
}
void test01()
{
goodGay G1;
G1.vist();
}
int main()
{
test01();
system("pause");
return 0;
}
成员函数做友元
声明格式:friend + 成员函数返回值类型 + 成员函数所属类名:: + 成员函数名(成员函数形参)
示例:
#include <iostream>
using namespace std;
class Building;
class GoodGay {
public:
GoodGay();
public:
void visit1();
void visit2();
private:
Building* m_building;
};
class Building {
//告诉编译器,允许下面这个成员函数访问当前类的私有属性
friend void GoodGay::visit1();
public:
Building();
public:
string m_SetingRoom;
private:
string m_Bedroom;
};
Building::Building()
{
m_SetingRoom = "客厅";
m_Bedroom = "卧室";
}
GoodGay::GoodGay()
{
m_building = new Building;
}
void GoodGay::visit1()
{
cout << "visit1正在访问" << m_building->m_SetingRoom << endl;
cout << "visit1正在访问" << m_building->m_Bedroom << endl;
}
void GoodGay::visit2()
{
cout << "visit2正在访问" << m_building->m_SetingRoom << endl;
//cout << "visit2正在访问" << m_building->m_Bedroom << endl;
}
void test01()
{
GoodGay G1;
G1.visit1();
G1.visit2();
}
int main()
{
test01();
system("pause");
return 0;
}
注:学习黑马视频的学习笔记