友元函数&友元类&友元成员函数
有些情况下,允许非成员函数访问类中的私有成员,但又阻止一般的访问,这种情况,就需要用到友元。
使用friend声明友元,友元的定义只能在类的内部
友元函数
有些情况下,全局函数需要访问类中的私有成员,这种函数叫友元函数;如:客人可以访问客厅,但一般客人不可以去主人卧室,关系较好的朋友才能访问私有的卧室,这时就要用到友元,友元的关键字为friend
示例
#include <iostream>
#include <string>
using namespace std;
/*********1、函数做友元**********/
class Building
{
//友元函数声明
friend void func(Building *build);
public:
Building()
{
m_sittingRoom = "客厅";
m_BedRoom = "卧室";
}
string m_sittingRoom; //客厅
private:
string m_BedRoom; //卧室
};
void func(Building *build)
{
cout << "访问客厅" << build->m_sittingRoom << endl;
cout << "访问卧室" << build->m_BedRoom << endl; //访问私有成员变量
}
void test01()
{
Building b;
func(&b);
}
int main(void)
{
test01();
system("pause");
return 0;
}
友元类
一个类中的成员函数存取另外一个类中的私有成员,这时需要用到友元类。
示例
#include <iostream>
#include <string>
using namespace std;
class Building;
class Visitor
{
public:
Visitor();
void visit1();
Building *building;
};
class Building
{
//友元类声明
friend class Visitor; //Visitor类作为Buliding的好朋友,可以访问Building中的私有成员
public:
Building();
string m_SittingRoom; //客厅
private:
string m_BedRoom; //卧室
private:
};
Building::Building()
{
this->m_BedRoom = "卧室";
this->m_SittingRoom = "客厅";
}
Visitor::Visitor() //构造函数
{
building = new Building;
}
void Visitor::visit1()
{
cout << "客人正在访问:" << building->m_SittingRoom << endl;
cout << "客人正在访问:" << building->m_BedRoom << endl;
}
void test02()
{
Visitor v1;
v1.visit1();
}
int main(void)
{
test02();
system("pause");
return 0;
}
友元成员函数
成员函数作为其他类的友元,可以访问类的私有成员,此函数称为友元成员函数。
#include <iostream>
#include <string>
using namespace std;
class Building;
class Visitor
{
public:
Visitor();
void visit();
Building *building;
};
class Building
{
public:
//友元成员函数
friend void Visitor::visit(); //可访问此类下的私有成员
Building();
string m_sittingRoom;
private:
string m_bedRoom;
};
Building::Building() //构造函数
{
m_sittingRoom = "客厅";
m_bedRoom = "卧室";
}
Visitor::Visitor() //构造函数
{
building = new Building; //在堆区开辟内存,实例化对象
}
void Visitor::visit()
{
cout << "客厅:" << building->m_sittingRoom << endl;
cout << "卧室:" << building->m_bedRoom << endl;
}
void test03()
{
Visitor v1;
v1.visit();
}
int main(void)
{
test03();
system("pause");
return 0;
}