在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类 访问另一个类中私有成员
友元的关键字为 friend
友元的三种实现
- 全局函数做友元
- 类做友元
- 成员函数做友元
一、全局函数做友元
#include<iostream>
#include<string.h>
using namespace std;
//房屋的类
class Building
{
public:
string m_SittingRoom;
Building()//开始调用默认构造函数的时候就对对象赋初值
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
private:
string m_BedRoom ;
};
//全局 函数
void goodGay(Building *building)
{
cout << "好基友的全局函数正在访问:" << building->m_SittingRoom << endl;
// cout << "好基友的全局函数正在访问:" << building->m_BedRoom << endl;
}
void test()
{
Building building;//声明对象
goodGay(&building);//调用函数
}
int main()
{
test();
system("pause");
return 0;
}
声明的类里面有public和private的对象,我们先访问public里面的结果会是这样:
没有任何问题,但如果在 下面继续访问private的话就会出现这样的:
私有类外访问不到。
那怎么办呢?
将函数复制到类里面然后前面添加一个friend最后添加分号就可以了。表明这个函数是一个友好的元素可以访问类中的私有成员。
#include<iostream>
#include<string.h>
using namespace std;
//房屋的类
class Building
{
//goodGay全局函数是Building的好朋友,可以访问Building中私有成员
friend void goodGay(Building* building);
public:
string m_SittingRoom;
Building()//开始调用默认构造函数的时候就对对象赋初值
{
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
private:
string m_BedRoom ;
};
//全局 函数
void goodGay(Building *building)
{
cout << "好基友的全局函数正在访问:" << building->m_SittingRoom << endl;
cout << "好基友的全局函数正在访问:" << building->m_BedRoom << endl;
}
void test()
{
Building building;//声明对象
goodGay(&building);//调用函数
}
int main()
{
test();
system("pause");
return 0;
}
再来看看结果:没有问题。
二、类做友元
#include <iostream>
#include<string.h>
using namespace std;
class Building
{
public:
Building();
string m_SittingRoom;
private:
string m_BedRoom;
};
class GoodGay
{
public:
GoodGay();
void vist();//待会儿访问Building里面的成员。
Building* buid;
};
//类外写成员函数
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
//创建建筑物对象
buid = new Building;
}
void GoodGay::vist()
{
cout << "好基友正在访问:" << buid->m_SittingRoom << endl;//访问客厅
// cout << "好基友正在访问:" << buid->m_BedRoom << endl;//访问卧室
}
void test()
{
GoodGay gg;
gg.vist();
}
int main()
{
test();
system("pause");
return 0;
}
像这样,如果在类外写成员函数的话,首先在类内声明一下然后再在外面实现,实现的时候先写类名然后::。
如果想访问私有成员的话直接访问依然会出现之前那种错误,所以·················
#include <iostream>
#include<string.h>
using namespace std;
class Building
{
friend class GoodGay;//友好GoodGay类
public:
Building();
string m_SittingRoom;
private:
string m_BedRoom;
};
class GoodGay
{
public:
GoodGay();
void vist();//待会儿访问Building里面的成员。
Building* buid;
};
//类外写成员函数
Building::Building()
{
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
//创建建筑物对象
buid = new Building;
}
void GoodGay::vist()
{
cout << "好基友正在访问:" << buid->m_SittingRoom << endl;//访问客厅
cout << "好基友正在访问:" << buid->m_BedRoom << endl;//访问卧室
}
void test()
{
GoodGay gg;
gg.vist();
}
int main()
{
test();
system("pause");
return 0;
}
这样就没什么问题了。
三、成员函数做友元
和之前一样吗,我们先构建一个场景。
#include<iostream>
#include<string.h>
using namespace std;
class Building;
class GodGay
{
public:
GodGay();
void vist();
void vist2();
private:
Building *building;
};
class Building
{
friend void GodGay::vist2();//vist2()可以访问Building里面的私有成员,但vist1()不能。
public:
Building();
string m_sroom;
private:
string m_broom;
};
Building::Building()//Building默认构造函数就会对其中的变量赋初值
{
this->m_broom = "卧室";
this->m_sroom = "客厅";
}
GodGay::GodGay()//默认构造函数就会创建一个Building的类
{
building = new Building;
}
void GodGay::vist()
{
cout << "1访问:" << building->m_sroom << endl;
// cout << "1访问:" << building->m_broom << endl;//无法访问,只能注释掉
}
void GodGay::vist2()
{
cout << "2访问:" << building->m_sroom << endl;
cout << "2访问:" << building->m_broom << endl;
}
void test()
{
GodGay gg;
gg.vist();//要求让vist1能访问Building的私有成员
gg.vist2();//要求让vist2不能访问Building的私有成员
}
int main()
{
test();
system("pause");
return 0;
}
如果想vist()也可以访问的话怎么办呢?那就在Building里面声明一个vist()的友元。
#include<iostream>
#include<string.h>
using namespace std;
class Building;
class GodGay
{
public:
GodGay();
void vist();
void vist2();
private:
Building *building;
};
class Building
{
friend void GodGay::vist2();//vist2()可以访问Building里面的私有成员,但vist1()不能。
friend void GodGay::vist();
public:
Building();
string m_sroom;
private:
string m_broom;
};
Building::Building()//Building默认构造函数就会对其中的变量赋初值
{
this->m_broom = "卧室";
this->m_sroom = "客厅";
}
GodGay::GodGay()//默认构造函数就会创建一个Building的类
{
building = new Building;
}
void GodGay::vist()
{
cout << "1访问:" << building->m_sroom << endl;
cout << "1访问:" << building->m_broom << endl;
}
void GodGay::vist2()
{
cout << "2访问:" << building->m_sroom << endl;
cout << "2访问:" << building->m_broom << endl;
}
void test()
{
GodGay gg;
gg.vist();//要求让vist1能访问Building的私有成员
gg.vist2();//要求让vist2不能访问Building的私有成员
}
int main()
{
test();
system("pause");
return 0;
}
莫问题!