本篇我们介绍友元类。
上一篇我们知道友元函数可以访问类
内部的private属性成员。
那么友元类呢?
友元类也可以访问类的私有属性,但要注意:
1、友元关系不能被继承。
(A是B的友元类,C继承于A, 但C不一定是B的友元类。
除非B显式声明C也是友元类)
2、友元关系不能被传递。
(A是B的友元类,B是C的友元类,但A不一定是C的友元类,
除非C显式声明A是友元类)
3、友元关系不能反向。(A是B的友元类,但A没有声明B是A的友元类,
所以友元关系是单向的。除非A显式声明B是A的友元类)
下面我们举个例子来说明友元类的访问权限:
/****************************************************
* brief : 类作为友元函数
* author : shao
* date : 2020-03-06
* note : none
*
****************************************************/
#include <iostream>
using namespace std;
class GoodGay;
class Home{
//声明友元类
friend class GoodGay;
public:
string livingRoom; //客厅
Home();
private:
string bedRoom; //卧室
};
Home::Home()
{
this->livingRoom = "客厅";
this->bedRoom = "卧室";
}
class GoodGay{
public:
GoodGay();
void visit(void);
private:
Home *home; //在GoodGay中给Home实例化,方便等下访问
};
GoodGay::GoodGay()
{
home = new Home(); //给Home做实例化
}
void GoodGay::visit(void)
{
cout << "GoodGay 访问:" << home->livingRoom << endl;
cout << "GoodGay 访问:" << home->bedRoom << endl;
}
void test01(void)
{
GoodGay * gg = new GoodGay();
gg->visit();
}
int main(void)
{
test01();
return 0;
}
结果如下:
结果我们可以看到,GoodGay是Home的友元类(此时Home并非是GoodGay的友元类,
所以Home不能访问GoodGay的private成员),
GoodGay的成员函数可以访问Home类的private属性。