友元的相关概念——c++

25 篇文章 0 订阅

友元


自己的卧室只能自己访问,亲戚来了不允许进入,但是可以让好朋友进去。(解决方法:友元函数)

可以把一个全局函数声明为一个友元,可以把某个类的成员函数声明为一个友元,甚至可以将整个类声明为友元。



全局函数作友元

class Building
{
public:
	Building()
	{
		this->m_sittingroom = "客厅";
		this->m_bedroom = "卧室";
	}
public:
	string m_sittingroom;//客厅
private:
	string m_bedroom;//卧室(只能类内访问)
};
//可以设置友元,将一个全局函数设置成友元,可以访问到Buiding的私有属性。
void goodGay(Building* building)
{
	cout << "好基友正在访问:" << building->m_sittingroom << endl;
	//cout << "好基友正在访问:" << building->m_bedroom << endl;
}
int main()
{
	Building building;
	goodGay(&building); 
}

创建了对象(我的家),然后调用好朋友的函数,将对象的地址传进去,然后正常的访问客厅。但是这个函数是不能调我的家这个对象的卧室的,因为这个卧室是private的,只能类内用,但是如果将好朋友的函数改成友元,那么就能够访问了。

(直接在我的家的类中改)

class Building
{
	friend void goodGay(Building* building);
	//...
}

这样这个全局函数就可访问类中的私有成员变量了,相当于给这个全局函数设置了友元。

这也是在类外,除了类中的接口之外,能访问到私有成员变量的方法。



类作友元

class Building
{
public:
	Building();
	string m_sittingroom;
private:
	string m_bedroom;

};

//这里来额外介绍下类中的函数怎么在类外进行定义:
//只需要将访问约定好就行
Building::Building()
{
	this->m_bedroom = "卧室";
	this->m_sittingroom = "客厅";
}
class GoodGay
{
public :
	GoodGay()//构造函数
	{
		this->m_building = new Building;//在构造函数中创建了个房间,并且让指针维护这个房间。
	}

	void visit()//访问的动作
	{
		cout << "好基友正在访问:" << this->m_building->m_sittingroom << endl;
		//cout << "好基友正在访问:" << this->m_building->m_bedroom << endl;
	}

	Building* m_building;//访问的对象的指针

};

int main()
{
	GoodGay gg;
	gg.visit();
	return 0;
}

首先会创建一个好基友的对象gg,同时会调用自己的默认构造:默认构造中创建了一个building,然后再调用visit函数就可以访问building中的客厅了。但是不能访问building中的卧室(private权限)。在Building中作更改:

class Building
{
	friend class GoodGay;
public:
	Building();
	string m_sittingroom;
private:
	string m_bedroom;
};

这个友元必须声明,没有互逆的概念。



类中成员函数作友元

用上面的案例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<string>

class Building
{
public:
	Building();
	string m_sittingroom;
private:
	string m_bedroom;
};

//这里来额外介绍下类中的函数怎么在类外进行定义:
//只需要将访问约定好就行
Building::Building()
{
	this->m_bedroom = "卧室";
	this->m_sittingroom = "客厅";
}
class GoodGay
{
public :
	GoodGay()//构造函数
	{
		this->m_building = new Building;//在构造函数中创建了个房间,并且让指针维护这个房间。
	}

	void visit() //visit可以让这个函数访问到buidiling中的私有
	{
		cout << "好基友正在访问:" << this->m_building->m_sittingroom << endl;
		//cout << "好基友正在访问:" << this->m_building->m_bedroom << endl;
	}

	void visit2()//不让这个函数访问到building中的私有
	{
		cout << "好基友正在访问:" << this->m_building->m_sittingroom << endl;
		//cout << "好基友正在访问:" << this->m_building->m_bedroom << endl;
	}
	Building* m_building;

};

int main()
{
	GoodGay gg;
	gg.visit();
	return 0;
}

想要使GoodGay中的visit()函数可以访问到building中的私有变量,不想使GoodGay中的visit2()函数访问到building中的私有变量。

作更改:

class Building
{
    friend void GoodGay::visit();
public:
	Building();
	string m_sittingroom;
private:
	string m_bedroom;
};

这样就能访问了。

但是我的编译器好像出了点问题,显示GoodGay不是类或者命名空间,听莫名其妙的,最后也没有解决掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小明同学啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值