在程序里,有些私有属性,也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术—— 友元的目的是让一个函数或者类访问另一个类中私有成员
友元的关键字:friend
友元的三种实现:
(1)全局函数做友元
(2)类做友元
(3)成员函数做友元
1 全局函数做友元
friend 全局函数名();放入类内,告诉编译器该全局函数为该类的友元函数可以访问该类的私有成员。
#include <iostream>
#include <string>
using namespace std;
class Building
{
// 全局函数goodGay()是本类的好朋友,可以访问该类的私有成员
friend void goodGay(Building* building);
public:
string m_SittingRoom="客厅";//客厅
private:
string m_BedRoom="卧室";//卧室
};
//全局函数
void goodGay(Building* building)
{
cout << "全局函数中,对象可以访问类的公有成员:" << building->m_SittingRoom << endl;
cout << "全局函数中,对象可以访问类的友元成员:" << building->m_BedRoom << endl;
}
int main()
{
Building b1;
goodGay(&b1);
}
2 类做友元
friend class 类名1: 放入到类2里面,那么代表类1是类2的友元类,类1可以访问类2的私有成员
#include <iostream>
#include <string>
using namespace std;
class Building
{
public:
//GoodGay是本类的好朋友,可以访问本类的私有成员
friend class GoodGay;
Building();
string m_SittingRoom;
private:
string m_BedRoom;
};
class GoodGay
{
public:
GoodGay();
Building* building;
void visit();
};
//(1)类外:写成员函数
Building::Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
//创建建筑物对象
building = new Building;//在堆区创建对象空间,返回指针(指向该对象)
}
void GoodGay:: visit()
{
cout << "GoodGay类访问" << building->m_SittingRoom << endl;
cout << "GoodGay类访问" << building->m_BedRoom << endl;//GoodGay是Building类的好朋友,可以访问该类的私有成员
}
void test()
{
GoodGay gg;
gg.visit();
}
int main()
{
test();
}
3 成员函数做友元
friend 类1::函数名():放入类2里面,那么代表类1中的函数是类2的友元,该函数可以访问类2的私有成员
#include <iostream>
#include <string>
using namespace std;
class Building;
class GoodGay
{
public:
GoodGay();
Building* building;
void visit01();//让该函数可以访问building中私有成员:使其成为Building类的友元
void visit02();//普通函数不可以访问building中私有成员
};
class Building
{
//GoodGay类中的visit01成员函数是本类的好朋友,该成员函数可以访问本类私有成员
friend void GoodGay::visit01();
public:
Building();
string m_SittingRoom;
private:
string m_BedRoom;
};
//(1)类外:实现成员函数
Building::Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
//创建建筑物对象
building = new Building;//在堆区创建对象空间,返回指针(指向该对象)
}
void GoodGay::visit01()
{
cout << "GoodGay类访问" << building->m_SittingRoom << endl;
cout << "GoodGay类访问" << building->m_BedRoom << endl;
}
void GoodGay::visit02()
{
cout << "GoodGay类访问" << building->m_SittingRoom << endl;
//cout << "GoodGay类访问" << building->m_BedRoom << endl;
}
void test()
{
GoodGay gg;
gg.visit01();
}
int main()
{
test();
}