c++面向对象之友元

本文介绍了C++中的友元机制,旨在允许函数或类访问其他类的私有成员。通过`friend`关键字,可以实现全局函数、类以及成员函数作为友元。详细阐述了全局函数做友元、类做友元以及成员函数做友元的实现方式,并提到了成员函数做友元时需要注意的构造函数和成员函数的定义位置问题。
摘要由CSDN通过智能技术生成

友元的目的:允许一个函数或者类访问另一个类中私有成员
友元的关键字:friend

友元的三种实现

  • 全局函数做友元
  • 类做友元
  • 成员函数做友元

全局函数做友元

只要在类内的最上端写上friend 函数声明,就可以实现全局函数做友元。

class Building
{
	//告诉编译器goodGuy全局函数是类Building的好友,可以访问Building中私有成员
	friend void goodGuy(Building& building);

public:
	//构造函数
	Building()
	{
		m_sittingRoom = "客厅";
		m_bedRoom = "卧室";
	} 

	string m_sittingRoom; //客厅

private:
	string m_bedRoom; //卧室
};

//全局函数
void goodGuy(Building& building)
{
	cout << "好基友全局函数正在访问:" << building.m_sittingRoom << endl;
	cout << "好基友全局函数正在访问:" << building.m_bedRoom << endl;
}

void test1()
{
	Building building;
	goodGuy(building);
}

类做友元

只要在类内的最上端写上friend 类声明,就可以实现类做友元。

class Building
{
	//GoodGuy类是本类的好友,可以访问本类中的私有成员
	friend class GoodGuy;

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

private:
	string m_bedRoom; //卧室
};


class GoodGuy
{
public:
	GoodGuy()
	{
		build = new Building; //new 类名 表示创建一个该类的对象并且返回对象的指针
	}
	
	void visit()//参观函数访问Building中的属性
	{
		cout << "好基友类正在访问:" << build->m_sittingRoom << endl;
		cout << "好基友类正在访问:" << build->m_bedRoom << endl;
	}

	Building* build;
};

void test1()
{
	GoodGuy gg;
	gg.visit();
}

成员函数做友元

注意:在写代码时发现只有在类外去定义该类的构造函数和成员函数时,程序运行才不报错,要是在类内定义构造函数和成员函数时,程序运行会报错。

在类GoodGuy上方要写上Building类的声明,否则在执行Building* build时会报错,class GoodGuy要放在class Building前面,否则提示“GoodGuy”: 不是类或命名空间名称。

class Building;
class GoodGuy
{
public:
	GoodGuy();
	
	void visit();//让visit函数可以访问Building中的私有成员
	
	void visit2(); //让visit2函数不可以访问Building中的私有成员
	
	Building* build;
};

class Building
{

	//告诉编译器 GoodGuy类下的visit成员函数作文本类的好友,可以访问私有成员
	friend void GoodGuy::visit();

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

private:
	string m_bedRoom; //卧室
};

//类外实现成员函数
Building::Building()
{
	m_sittingRoom = "客厅";
	m_bedRoom = "卧室";
}

GoodGuy::GoodGuy()
{
	build = new Building;
}

void GoodGuy::visit()//让visit函数可以访问Building中的私有成员
{
	cout << "visit函数正在访问:" << build->m_sittingRoom << endl;
	cout << "visit函数正在访问:" << build->m_bedRoom << endl;
}

void GoodGuy::visit2()//让visit2函数不可以访问Building中的私有成员
{
	cout << "visit函数正在访问:" << build->m_sittingRoom << endl;
	//cout << "visit函数正在访问:" << build->m_bedRoom << endl;
}

void test1()
{
	GoodGuy gg;
	gg.visit();
	gg.visit2();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值