C++:类和对象: 友元

概念

1:程序中,某个类的私有属性 可以让类外  一些特殊函数或者类进行访问,这个就是友元技术 。

2:  有元的关键字是 : friend。

3:友元的三种实现:

全局函数做友元

类做友元

成员函数做友元

1:全局函数做友元 

案例:在类中直接在全局函数的声明添加 friend 即可。同时,不需要为其指定访问权限,直接放进去即可。

#include<iostream>
#include<string>
using namespace std;
class Building {
	// 通过firend修饰,可以告诉编译器:goodGay是全局函数,可以访问 类 Building中的私有成员变量
	friend void goodGay(Building* building);
public:
	Building() {
		this->m_settingRoom = "客厅";
		this->m_bedRoom = "卧室";
	}

	string m_settingRoom; // 客厅
private:
	string m_bedRoom; // 卧室

};

void goodGay(Building* build) {
	cout << "访问:" << build->m_settingRoom << endl;
	cout << "访问:" << build->m_bedRoom << endl;
}

int main() {
	Building b;
	goodGay(&b);
	return 0;
}

 根据运行结果可知:

有元全局函数可以访问到 私有成员变量。

2:类做友元 

案例:我们假设goodGay类有一个Building类的私有成员变量 building,而Building类存在一些 私有成员,如果我们想让 goodGay对象能够 访问 Building类的私有成员。那么我们就需要让 goodGay称为 Building类的 友元。

#include<iostream>
#include<string>
using namespace std;
class Building;
class goodGay {
public:
	goodGay();
	void visit();
private:
	Building* building;

};

class Building
{
	// 告诉编译器 googGay类 Building类的 友元类,可以访问 Building类中的私有内容。
	friend class goodGay;
public:
	Building(); // 提供默认构造函数
	string m_settingRoom; // 客厅
private:
	string m_bedRoom; //卧室

};

// 通过 Building:: 作用域也可以访问 这些成员变量
Building::Building() {
	this->m_bedRoom = "卧室";
	this->m_settingRoom = "客厅";
}

// 构造函数:直接构造一个 Building对象
goodGay::goodGay() {
	building = new Building();
}

void goodGay::visit() {
	
	cout << "访问:" << building->m_settingRoom << endl;
	// 因为 Building类声明 友元类 goodGay,所以可以访问 Building类中的私有成员属性 m_bedRoom
	cout << "访问: " << building->m_bedRoom << endl;
}

int main() {
	goodGay gg;
	gg.visit();
}

 运行结果可知:

goodGay是可以访问到 Building类中的私有成员变量。

3:成员函数做友元 

案例:现在goodGay里面有两个成员函数 visit1 和 visit2 。如果我们只想让 visit1作为 Building的友元函数,------那么就可以将 visit1的声明直接 写到 Building类中。

#include<iostream>
#include<string>
using namespace std;

class Building;
class goodGay {
public:
	goodGay();
	void visit1();
	void visit2();

private:
	Building* building;
};

class Building {
	// 告诉编译器 goodGay类中 visit1()成员函数是 Building类中的友元函数,可以访问其私有内容。
	friend void goodGay::visit1();

public:
	Building();
	string m_SettingRoom;
private:
	string m_bedRoom;
};

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

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

void goodGay::visit1() {
	cout << "访问私有变量:" << building->m_bedRoom << endl;
}

void goodGay::visit2() {
	cout << "访问公共变量:" << building->m_SettingRoom << endl;
}

int main() {
	goodGay gg;
	gg.visit1();
	gg.visit2();
	return 0;
}

从运行结果可知:友元成员函数可以访问对象的私有成员变量。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值