C++学习笔记之友元

孤身打马南屏旧桥边过,恰逢山雨来时雾蒙蒙。


友元的目的是使一个函数或者类访问另一个类的私有和保护成员。

友元可以为了使得程序中一些类外的函数或者类访问另一个类的私有属性。

友元有以下三种实现方式:

1.全局函数做友元;

2.类做友元;

3.成员函数做友元。

1.全局函数做友元

使用friend关键字在类中声明全局函数,使友元全局函数可以访问该类中的保护成员和私有成员。

#include <iostream>
#include <string>
using namespace std;
class Building
{
	friend void visit(Building *building);//将全局函数visit作为Building的友元
public:
	Building();
	string m_settingroom;
private:
	string m_bedroom;
};
Building::Building()
{
	this->m_settingroom = "客厅";
	this->m_bedroom = "卧室";
}

void visit(Building* m_building)
{
	cout << "你的好友正在访问" << m_building->m_settingroom << endl;
	cout << "你的好友正在访问" << m_building->m_bedroom << endl;
};

int main()
{
	Building *building1 = new Building;
	visit(building1);
	system("pause");
	return 0;
}

2.友元类

在类中使用friend关键字中声明友元类,使友元类可以访问该类中的私有和保护成员。


​#include <iostream>
#include <string>
using namespace std;
class Building
{
	friend class GoodFriend;//将GoodFriend类声明为Building类的友元
public:
	Building();
	~Building() {};
	string m_settingroom;
private:
	string m_bedroom;
};
Building::Building()
{
	this->m_settingroom = "客厅";
	this->m_bedroom = "卧室";
}
class GoodFriend
{
public:
	Building* m_Building;
	GoodFriend();
	~GoodFriend() ;
	void visit();
};
GoodFriend::GoodFriend()
{
	m_Building = new Building;
}
GoodFriend::~GoodFriend()
{
	 delete m_Building;
}

void GoodFriend::visit()
{
	cout << "你的好友正在访问" << m_Building->m_settingroom << endl;
	cout << "你的好友正在访问" << m_Building->m_bedroom << endl;
}
void  test()
{
	GoodFriend gg;
	gg.visit();
}
int main()
{
	test();
	system("pause");
	return 0;
}

3.成员函数做友元

在类中使用friend关键字声明成员函数,使得友元成员函数可以访问该类中的保护和私有成员。

#include <iostream>
#include <string>
using namespace std;
class Building;//由于GoodFriend类中使用到Building类,提前声明。
class GoodFriend
{
public:
	GoodFriend();
	~GoodFriend();
	void visit();//visit不可以访问Buliding类的私有成员
	void visit2();//visit2可以访问Buliding类的私有成员

private:
	Building* m_Building;

};
class Building
{
	friend void GoodFriend::visit2();//将GoodFriend的成员函数visit2声明为Buliding类的友元
public:
	Building();
	~Building() {};
	string m_settingroom;
private:
	string m_bedroom;
};
Building::Building()
{
	this->m_settingroom = "客厅";
	this->m_bedroom = "卧室";
}

GoodFriend::GoodFriend()
{
	m_Building = new Building;
}
GoodFriend::~GoodFriend()
{
	delete m_Building;
}
void GoodFriend::visit()
{
	cout << "你的好友正在访问" << m_Building->m_settingroom << endl;
}
void GoodFriend::visit2()
{
	cout << "你的好友与你一起访问" << m_Building->m_settingroom << endl;
	cout << "你的好友与你一起访问" << m_Building->m_bedroom << endl;
}
void  test()
{
	GoodFriend gg;
	gg.visit();
	gg.visit2();
}
int main()
{
	test();
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值