C++类与对象笔记十一:友元

友元的用途:可以访问类内私有成员

场景:

生活中你的家有客厅(Public),有你的卧室(Private)

客厅所有来的客人都可以进去public,但是你的卧室是私有的private,也就是说只有你能进去。

但是呢,你也可以允许你的好闺蜜好基友friend(友元)进去。

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

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

友元的三种实现

  • 全局函数做友元

  • 做友元

  • 成员函数做友元




全局函数做友元

class Building
{
	//告诉编译器 goodGay全局函数 是 Building类的好朋友,可以访问类中的私有内容
	friend void goodGay(Building * building);   // 重点代码:声明友元:全局函数,可以访问私有内容。

public:

	Building()
	{
		this->m_SittingRoom = "客厅";
		this->m_BedRoom = "卧室";
	}


public:
	string m_SittingRoom; //客厅

private:
	string m_BedRoom; //卧室
};


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


void test01()
{
	Building b;
	goodGay(&b);
}

int main(){

	test01();

	system("pause");
	return 0;
}


类做友元:

一种关于类成员函数新的写法。 // 类内声明;类外实现。注意双冒号::限定作用域。

class Building;    // 我们可能需要在实现之前先用到一些类或者函数,因此在代码中可以先声明一些类或者函数。
class goodGay
{
public:

	goodGay();
	void visit();

private:
	Building *building;
};


class Building
{
	//告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容
	friend class goodGay;  // 重点代码:声明友元:类,可以访问私有内容。

public:
	Building();

public:
	string m_SittingRoom; //客厅
private:
	string m_BedRoom;//卧室
};

// 类内声明。类外实现成员函数。(成员函数的一种写法。)要注意双冒号::限定访问作用域。

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

goodGay::goodGay()
{
	building = new Building;   // goodGay中有一个Building的指针,可以通过构造函数创造一个类实例。new 类名;
}

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

void test01()
{
	goodGay gg;
	gg.visit();

}

int main(){

	test01();

	system("pause");
	return 0;
}



成员函数做友元


class Building;   // 我们可能需要在实现之前先用到一些类或者函数,因此在代码中可以先声明一些类或者函数。
class goodGay
{
public:

	goodGay();
	void visit(); //只让visit函数作为Building的好朋友,可以发访问Building中私有内容
	void visit2();  // 让visit函数不可以访问Building中的私有成员。

private:
	Building *building;
};


class Building
{
	//告诉编译器  goodGay类中的visit成员函数 是Building好朋友,可以访问私有内容
	friend void goodGay::visit();    // 重点代码:声明友元:成员函数,可以访问私有内容。

public:
	Building();

public:
	string m_SittingRoom; //客厅
private:
	string m_BedRoom;//卧室
};
// 类内声明。类外实现成员函数。(成员函数的一种写法。)要注意双冒号::限定访问作用域。
Building::Building()
{
	this->m_SittingRoom = "客厅";
	this->m_BedRoom = "卧室";
}

goodGay::goodGay()
{
	building = new Building;    // goodGay中有一个Building的指针,可以通过构造函数创造一个类实例。new 类名;
}

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

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

void test01()
{
	goodGay  gg;
	gg.visit();

}

int main(){
    
	test01();

	system("pause");
	return 0;
}


总结:

类内有些成员设置为私有,如果想在类外访问:需要将权限设置为friend。并在类内事先声明:指明那些类或者方法是我们的友元

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值