友元的用途:可以访问类内私有成员。
场景:
生活中你的家有客厅(Public),有你的卧室(Private)
客厅所有来的客人都可以进去public,但是你的卧室是私有的private,也就是说只有你能进去。
但是呢,你也可以允许你的好闺蜜好基友friend(友元)进去。
在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术。
友元的目的就是让一个函数或者类 访问另一个类中私有成员。友元关键字:friend。
友元的三种实现
-
全局函数做友元
-
类做友元
-
成员函数做友元
全局函数做友元
class Building
{
//告诉编译器 goodGay全局函数 是 Building类的好朋友,可以访问类中的私有内容
friend void goodGay(Building * building); // 重点代码:声明友元:全局函数,可以访问私有内容。
public:
Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom; //卧室
};
void goodGay(Building * building)
{
cout << "好基友正在访问: " << building->m_SittingRoom << endl;
cout << "好基友正在访问: " << building->m_BedRoom << endl;
}
void test01()
{
Building b;
goodGay(&b);
}
int main(){
test01();
system("pause");
return 0;
}
类做友元:
一种关于类成员函数新的写法。 // 类内声明;类外实现。注意双冒号::限定作用域。
class Building; // 我们可能需要在实现之前先用到一些类或者函数,因此在代码中可以先声明一些类或者函数。
class goodGay
{
public:
goodGay();
void visit();
private:
Building *building;
};
class Building
{
//告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容
friend class goodGay; // 重点代码:声明友元:类,可以访问私有内容。
public:
Building();
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom;//卧室
};
// 类内声明。类外实现成员函数。(成员函数的一种写法。)要注意双冒号::限定访问作用域。
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
goodGay::goodGay()
{
building = new Building; // goodGay中有一个Building的指针,可以通过构造函数创造一个类实例。new 类名;
}
void goodGay::visit()
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
cout << "好基友正在访问" << building->m_BedRoom << endl;
}
void test01()
{
goodGay gg;
gg.visit();
}
int main(){
test01();
system("pause");
return 0;
}
成员函数做友元
class Building; // 我们可能需要在实现之前先用到一些类或者函数,因此在代码中可以先声明一些类或者函数。
class goodGay
{
public:
goodGay();
void visit(); //只让visit函数作为Building的好朋友,可以发访问Building中私有内容
void visit2(); // 让visit函数不可以访问Building中的私有成员。
private:
Building *building;
};
class Building
{
//告诉编译器 goodGay类中的visit成员函数 是Building好朋友,可以访问私有内容
friend void goodGay::visit(); // 重点代码:声明友元:成员函数,可以访问私有内容。
public:
Building();
public:
string m_SittingRoom; //客厅
private:
string m_BedRoom;//卧室
};
// 类内声明。类外实现成员函数。(成员函数的一种写法。)要注意双冒号::限定访问作用域。
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
goodGay::goodGay()
{
building = new Building; // goodGay中有一个Building的指针,可以通过构造函数创造一个类实例。new 类名;
}
void goodGay::visit()
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
cout << "好基友正在访问" << building->m_BedRoom << endl;
}
void goodGay::visit2()
{
cout << "好基友正在访问" << building->m_SittingRoom << endl;
//cout << "好基友正在访问" << building->m_BedRoom << endl;
}
void test01()
{
goodGay gg;
gg.visit();
}
int main(){
test01();
system("pause");
return 0;
}
总结:
类内有些成员设置为私有,如果想在类外访问:需要将权限设置为friend。并在类内事先声明:指明那些类或者方法是我们的友元。