【C++核心编程 4】——类和对象——4.4 友元[ 全局函数做友元 / 类做友元 / 成员函数做友元 ]

文章介绍了C++中的友元机制,包括全局函数作为友元、类作为友元以及成员函数作为友元的三种实现方式,允许非成员函数或类访问其他类的私有成员,以此扩展了访问控制的灵活性。
摘要由CSDN通过智能技术生成

4.4 友元

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

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

友元的关键字为 friend



友元的三种实现:

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

4.4.1 全局函数做友元

friend void bestFriend(Building* build);

示例:

#include<iostream>
#include<string>
using namespace std;
class Building {
  //bestFriend全局函数是Building好朋友,可以访问Building中的私有成员
	friend void bestFriend(Building* build);
public:
	Building() {
		this->sittingRoom = "客厅";
		this->bedRoom = "卧室";
	}
public:
	string sittingRoom;
private:
	string bedRoom;
};

//全局函数
void bestFriend(Building *build) {
	cout << "my best friend in my " << build->sittingRoom << endl;
	cout << "my best friend in my " << build->bedRoom << endl;//非友元时不能访问bedRoom
}

void test01() {
	Building build1;
	bestFriend(&build1);
}
int main() {
	test01();
	return 0;
}

4.4.2 类做友元

一、类做友元,访问本类中的私有成员

friend class bestFriend;

二、在类外实现成员函数

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

class Building;  //先声明一下这个类,告诉系统等下写这个类

class bestFriend {
public:
	bestFriend();
	void visit();//参观函数,访问Building中的属性
private:
	Building* buildings;//指针
};

class Building {
	//类做友元,访问本类中私有成员
	friend class bestFriend;
public:
	Building();
	string sitting_room;
private:
	string bed_room;
};

//类外写成员函数
Building::Building() {
	this->sitting_room = "客厅";
	this->bed_room = "卧室";
}

bestFriend::bestFriend() {
	//在堆区创建一个Building对象,让指针*buildings指向这个对象
	buildings = new Building;
}
void bestFriend::visit() {
	cout << "my bestfriend in my " << buildings->sitting_room << endl;
	cout << "my bestfriend in my " << buildings->bed_room << endl;
}
void test01() {
	bestFriend bf;
	bf.visit();
}
int main() {
	test01();
	return 0;
}

4.4.3 成员函数做友元

friend void bestFriend::visit1();

示例:

#include<iostream>
#include<string>
using namespace std;
class Building;
class bestFriend {
public:
	bestFriend();
	void visit1();//让visit1()   可以访问Building中的私有成员
	void visit2();//让visit2() 不可以访问Building中的私有成员
private:
	Building *buildings;
};

class Building {
	//成员函数做友元
	//告诉编译器,bestFriend类下的visit1()成员函数作为本类的好友,可以访问本类的私有成员
	friend void bestFriend::visit1();
public:
	Building();
	string sitting_room;
private:
	string bed_room;
};
Building::Building() {
	this->sitting_room = "sitting room";
	this->bed_room = "bed room";
}
bestFriend::bestFriend() {
	buildings = new Building;
}
void bestFriend::visit1() {
	cout << "visit1 my best friend in my " << buildings->sitting_room << endl;
	cout << "visit1 my best friend in my " << buildings->bed_room << endl;
}
void bestFriend::visit2() {
	cout << "visit2 my best friend in my " << buildings->sitting_room << endl;
}

void test01() {
	bestFriend bf;
	bf.visit1();
	bf.visit2();
}
int main() {
	test01();
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值