在程序里一些私有属性也想让类外特殊的一些函数或者类进行访问,需要用到友元技术。
友元的目的就是让一个函数或者类访问一个类中的私有成员,关键字为friend.
友元的三种实现:
- 全局函数做友元;
- 类做友元;
- 成员函数做友元。
1、全局函数做友元
friend + void + 函数名();
放在类的里面,告诉类该函数为该类的友元,则该函数就可以访问私有成员。代码例子如下:
#include<iostream>
#include<string>
using namespace std;
class Building
{
//goodGay是Building的好朋友,可以访问Building的私有成员函数
friend void goodGay(Building *building);
public:
Building()
{
m_sittingRoom = "客厅";
m_bedRoom = "卧室";
}
public:
string m_sittingRoom;
private:
string m_bedRoom;
};
//全局函数
void goodGay(Building *building)
{
cout << "好基友的全局函数,正在访问public中:" << building->m_sittingRoom << endl;
cout << "好基友的全局函数,正在访问public中:" << building->m_bedRoom << endl;//直接访问错误,但是用友元是正确的
}
//测试函数
void test01()
{
Building B;
goodGay(&B);
}
int main()
{
test01();
system("pause");
return 0;
}
2、类做友元
类放在另一个类里+friend 声明
如:class A{
friend class B;
};
则在B中就可调用A的私有函数
代码示例:
#include<iostream>
#include<string>
using namespace std;
class Building;
class GoodGay
{
public:
GoodGay();
void visiting();
Building *building;
~GoodGay();
};
class Building {
//GoodGay是Building的好朋友,可以访问私有成员
friend class GoodGay;
public:
Building();
public: string m_SittingRoom;
private: string m_BedRoom;
};
//类外写成员函数
Building::Building()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
//创造一个建筑物的对象
//指针指向堆区的一块内存
building = new Building;
}
void GoodGay::visiting()
{
cout << "好基友的类正在访问:" << building->m_SittingRoom << endl;
cout << "好基友的类正在访问:" << building->m_BedRoom << endl;
}
//释放内存(析构函数)
GoodGay::~GoodGay()
{
delete building;
}
void test01()
{
GoodGay gg;
gg.visiting();
}
int main()
{
test01();
system("pause");
return 0;
}
3、成员函数做友元
主要语法:将B类的函数放在A类里面加上friend关键字。
class A{
friend void B::visit();
};
代码示例:
#include<iostream>
#include<string>
using namespace std;
class Build;
class GoodGay
{
public:
GoodGay();
void visit();//让visit访问Building中的私有成员
void visit2();//不让visit访问Building中的私有成员
Build *building;
};
class Build
{
//告诉编译器 GoodGay类下的visit函数是Build的友元,可访问私有成员
friend void GoodGay::visit();
public:
Build();//类外实现成员函数
string m_SittingRoom;
private:
string m_BedRoom;
};
Build::Build()
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
building = new Build;
}
void GoodGay::visit()
{
cout << "visit 函数正在访问:" << building->m_SittingRoom << endl;
cout << "visit 函数正在访问:" << building->m_BedRoom << endl;
}
void GoodGay::visit2()
{
cout << "visit2 函数正在访问:" << building->m_SittingRoom << endl;
}
void test01()
{
GoodGay gg;
gg.visit();
gg.visit2();
}
int main()
{
test01();
system("pause");
return 0;
}