--->让一个函数或者类访问另一个类中的私有成员
一.全局函数做友元
//全局函数作友元
#include <iostream>
#include <string>
using namespace std;
class Building
{
//友元,必须写在public下面,否则会被默认为私有
public:
friend void GoodGay02(Building* building);
Building()//构造函数
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
void GoodGay01(Building* building)//访问公共成员
{
cout << "正在访问:" << building->m_SittingRoom << endl;
}
void GoodGay02(Building* building)//访问私有成员
{
cout << "正在访问:" << building->m_BedRoom << endl;
}
void test01()
{
Building building;
GoodGay01(&building);
GoodGay02(&building);
}
int main()
{
test01();
return 0;
}
二.类做友元
//类作友元
#include <iostream>
#include <string>
using namespace std;
class Building;
class GoodGay
{
public:
GoodGay()//构造函数
{
building = new Building;//building为内部指针,用new在堆区创建一个对象,会返回Building类型的指针
}
void visit();//参观函数
private:
Building* building;//Building类型的指针
};
void GoodGay::visit()
{
cout << "正在访问:" << building->m_SittingRoom << endl;//公共
cout << "正在访问:" << building->m_BedRoom << endl;//私有
}
class Building
{
friend class GoodGay;
public:
Building()//构造函数
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
void test01()
{
GoodGay gg;
gg.visit();
}
int main()
{
test01();
return 0;
}
三.成员函数做友元
//成员函数作友元
#include <iostream>
#include <string>
using namespace std;
class Building;
class GoodGay
{
public:
GoodGay();
void visit();//可以访问Building中的私有成员
private:
Building* building;
};
class Building
{
public:
friend void GoodGay::visit();
Building();
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
building = new Building;//在堆区创建对象
}
void GoodGay::visit()//类外实现成员函数
{
cout << "正在访问:" << building->m_SittingRoom << endl;
cout << "正在访问:" << building->m_BedRoom << endl;
}
void test01()
{
GoodGay gg;
gg.visit();
}
int main()
{
test01();
return 0;
}
注意:
1.Building类中会先介绍自己的朋友,所以朋友类要优先于Building类,但是朋友类中又维护了一个私有变量Building* building,所以要先声明Building类
2.所有函数的定义都要写在类外,并且要在Building类和GoodGay类的下面,否则无法运行!!!!!