友元目的:让一个函数或一个类,访问另一个类中的私有成员
友元的三种实现:全局函数做友元,类做友元,成员函数做友元
一、全局函数做友元
全局函数里在类中声明为友元后,可以访问这个类的私有成员
friend void func();
二、类做友元
class Building
{
public:
friend class GoodGay;
....
};
_______________________
(GoodGay类,构造函数必须创建对象空间,用声明的成员函数接收)
void test01()
{
GoodGay g; //创建对象时,调用构造函数,在堆区创建对象
g.visit();
}
—————————————
class GoodGay
{
public:
GoodGay()
{
m_building = new Building; //声明了Building作为成员后,构造函数在堆区开辟空间
}
public:
void visit();
public:
Building* m_building; //一个类对象,作为另一个类的共有成员
//Building类型指针接收在堆区创建的对象地址
};
void GoodGay::visit()
{
cout << "好基友正在访问" << m_building->m_SittingRoom << endl;
cout << "好基友正在访问" << m_building->m_BedRoom << endl;//使得Building的私有可以访问
}
#include<iostream>
using namespace std;
#include<string>
class Building
{
public:
Building();
friend class GoodGay;
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
Building::Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
class GoodGay
{
public:
GoodGay()
{
m_building = new Building;
}
public:
void visit();
public:
Building* m_building; //一个类对象,作为另一个类的共有成员
};
void GoodGay::visit()
{
cout << "好基友正在访问" << m_building->m_SittingRoom << endl;
cout << "好基友正在访问" << m_building->m_BedRoom << endl;
}
void test01()
{
GoodGay g;
g.visit();
}
int main()
{
test01();
system("pause");
return 0;
}
三、成员函数做友元
Goodgay类,Building类
目的: 只有GoodGay类中某一成员函数,才可以访问Building类私有成员
而不是GoodGay类,所有成员函数都可以访问
class Building
{
public:
Building();
friend void GoodGay::visit01(); //GoodGay类中成员函数,声明为Building的友元函数
....
};
_____________________
class GoodGay
{
public:
void visit01(); //可以访问,Building的私有成员
void visit02(); //不可以访问,Building的私有成员
...
};
#include<iostream>
using namespace std;
#include<string>
class Building;
class GoodGay
{
public:
GoodGay();
void visit01();
void visit02();
public:
Building* m_building;
};
class Building
{
public:
Building();
friend void GoodGay::visit01();
public:
string m_SittingRoom;
private:
string m_BedRoom;
};
Building::Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
m_building = new Building;
}
void GoodGay::visit01() //可以访问,Building的私有成员
{
cout << "vist01 正在访问" << m_building->m_SittingRoom << endl;
cout << "vist01 正在访问" << m_building->m_BedRoom << endl;
}
void GoodGay::visit02() // 不可以访问,Building的私有成员
{
cout << "vist02 正在访问" << m_building->m_SittingRoom << endl;
//cout << "vist01 正在访问" << m_building->m_BedRoom << endl;
}
void test01()
{
GoodGay gg;
gg.visit01();
gg.visit02();
}
int main()
{
test01();
system("pause");
return 0;
}