day4 努力学习的一天

实验:没加入自注意力机制反而效果更好,还得继续炼丹

友元

在程序里,有些私有属性也想让类外特殊的一些函数或类进行访问,就需要用到友元技术

有元的目的就是让一个函数或者类,访问另一个类中私有成员

友元的关键字是 :friend

三种属性: 全局函数做友元   类做友元  成员函数做友元

全局函数做友元

//建筑物类
class Building 
{

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

private:
	string m_BedRoom;
};

然后设置一个全局函数

void goodgay(Building *building) 
{
	cout << "好基友正在访问:" << building->m_SittingRoom << endl;
	cout << "好基友正在访问:" << building->m_BedRoom << endl;

}

这段代码写好后会发现m_BedRoom会报错,因为这是私有属性,类外访问不到,因此需要将该全局函数做为友元,才可以访问类内私有的参数。在Building类中写下面这行代码,便可正常访问。

语法 :friend void goodgay(Building *building);

friend void goodgay(Building *building);

类做友元

使用类做友元 的时候学了新的东西,就是在类外去写成员函数,首先还是先定义两个类

class Building
{

public:
	Building();
public:
	string m_SittingRoom;//客厅

private:
	string m_BedRoom;
};

class goodGay
{
public:
	goodGay();
public:

	void visit();//参观函数访问building中的属性

	Building* building;
};

然后在类外定义成员函数

Building::Building()
{
    m_SittingRoom = "客厅";
    m_BedRoom = "卧室";
}

goodGay::goodGay()
{
    building = new Building; 
}


new Building这行代码会在堆区上动态分配内存,创建一个Building 对象,并调用 Building 类的构造函数。也就是说当实例化goodGay gg; 的时候,就会先调用该构造函数,然后执行到该构造函数的函数体中会创建一个Building这个类,并且调用该类的构造函数给该类的属性赋值。

void goodGay::visit()
{
	cout << "好基友类正在访问:" << building->m_SittingRoom << endl;
	cout << "好基友类正在访问:" << building->m_BedRoom << endl;
}

这时候还没将这个类做友元,所以在访问building的私有属性时还是会报错,我们只需将该类设置成友元即可。语法  :friend class goodGay;

class Building
{
	//goodGay类是本类的好朋友,可以访问这个类的私有成员
	friend class goodGay;

public:
	Building();
public:
	string m_SittingRoom;//客厅

private:
	string m_BedRoom;
};

成员函数做友元

class Building;
class goodGay
{

public:
	goodGay();
public:

	void visit();//让visit可以访问building中私有成员
	void visit2();//让visit2不可以访问building中私有成员

	Building* building;
};

class Building
{
	
public:
	Building();
public:
	string m_SittingRoom;//客厅

private:
	string m_BedRoom;
};

然后按照上面的知识点继续在类外构造成员函数

Building::Building() 
{
	m_SittingRoom = "客厅";
	m_BedRoom = "卧室";
}
goodGay::goodGay() 
{
	building = new Building;
}
void goodGay::visit() 
{
	cout << "visit正在访问:" << building->m_SittingRoom << endl;

	cout << "visit正在访问:" << building->m_BedRoom << endl;
}
void goodGay::visit2()
{
	cout << "visit2正在访问:" << building->m_SittingRoom << endl;

	//cout << "visit2正在访问:" << building->m_BedRoom << endl;
}

没设置友元的时候,visit和visit2都访问不到building的私有属性

所以我们要将visit函数设置成友元

friend void goodGay::visit();

class Building
{
	
	friend void goodGay::visit();
public:
	Building();
public:
	string m_SittingRoom;//客厅

private:
	string m_BedRoom;
};

语法:friend void goodGay::visit();

告诉编译器 goodGay类下的visit这个成员函数作为本类的友元,可以访问私有成员

炼丹炼丹,晚上继续学习,加油加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值