类的友元

162 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

1、友元的作用:

我们有三种访问控制符,其中私有类型private只能在类中访问,不能在类外访问。但有时候我们并不是想让所有类外的函数或其他类都不能访问私有成员,这时候我们就可以把他们设置成友元给予他们访问权限。

2、全局函数左友元

我们先设计一个Building类,我们把客厅设置为公有成员,卧室设置为私有成员

class Buiding
{
public:
	string m_SittingRoom;//客厅
	Buiding()
	{
		m_SittingRoom = "客厅";
		m_BedRoom = "卧室";
	}
private:
	string m_BedRoom;
};

再写一个全局函数,会明显发现我们在全局函数中不能访问Building类的私有成员m_BedRoom。

image.png 这个时候为了让这个全局函数goodGay()可以访问Building类中的私有成员,我们可以将全局函数goodGay()设置为友元函数: 只需要在Building类中声明一下该函数,并在函数前加上关键字friend即可。

class Buiding
{
	friend void goodGay(Buiding *buiding);//这个是Buiding类的好朋友,可以访问私有成员。
public:
	string m_SittingRoom;//客厅
	Buiding()
	{
		m_SittingRoom = "客厅";
		m_BedRoom = "卧室";
	}
private:
	string m_BedRoom;
};

此时编译器据不会再报错,在主函数中调用全局函数goodGay(),可以看出全局函数此时可以访问类中的私有成员。

image.png

2、类做友元

除了全局函数不能访问类的私有成员,其他类也不能访问类中的私有成员,这个时候我们就可以把,其他类设置成该类的友元类,基于访问私有成员的权限。这里我们创建两个类Building类和goodGay类:

//类做友元
class goodGay
{
public:
	goodGay();
	void visit();//参观函数 访问Building中的属性
	void visit2();//参观函数 访问Building中的属性
	Buiding *buiding;
};
class Buiding
{
        //friend coid goodGay::visit();
	friend class goodGay ;//设置友元类 ,goodGay类中的函数都可以可以访问私有成员 
public:
	Buiding();
	string m_SittingRoom;
private:
	string m_BedRoom;
};
Buiding::Buiding()
{
	m_SittingRoom = "客厅";
	m_BedRoom = "卧室";
}
goodGay::goodGay()
{
	buiding = new Buiding();//在堆区创建对象
}
void goodGay :: visit()
{
	cout << "函数1正在访问:" << buiding->m_SittingRoom << endl;
	cout << "函数1正在访问:" << buiding->m_BedRoom << endl;
}
void goodGay::visit2()
{
	cout << "函数2正在访问:" << buiding->m_SittingRoom << endl;
	cout << "函数2正在访问:" << buiding->m_BedRoom << endl;
}

image.png

3、成员函数做友元

上面是把goodGay类作为友元,这样goodGay 类中的两个成员函数都可以访问Building类中的私有成员,其实全局函数一样,我们以可以把类中的某个某个成员函数设置成友元函数。方法如下:

friend void goodGay::visit();//friend 关键词加函数声明 同时著名函数的作用域

image.png

此时visit2()函数不是友元,visit1()函数是友元,所以在上图中最后一行visit2()调用私有成员m_BedRoom时会报错。

4、友元关系的注意事项:

1:友元关系是单向。

2:友元关系不可传递。

3:友元关系不可继承。