C++友元函数friend使用的学习总结

C++友元函数friend使用的学习总结

1. 友元函数简介

1.1 使用友元函数的目的

​ 允许一个函数或者类访问另一个类中的私有成员,使得两个类可以共享同一数据。

举个例子,有亲戚去你家拜访,那么客厅是所有人可见的(public类),但自己的房间就不太方便了(private类),不过自己的基友或者闺蜜可以进入你的房间,这就需要友元函数,这就是friend。

1.2 友元函数的三种实现方法

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

2.全局函数做友元

​ 全局函数做友元,就是在类外定义一个全局函数,该全局函数传入一个类的指针或者引用。该类的公共成员可以直接调用,若将该全局函数作为友元写入类中,该函数就可调用私有成员。

代码如下:

#include <iostream>
using namespace std;

class House {

	//设置全局函数bestFriend是类的好朋友,可以访问类中的私有成员m_BedRoom
	friend void bestFriend(House& house);
	
public:
	House()
	{
		m_SittingRoom = "客厅";
		m_BedRoom = "卧室";
	}

	string m_SittingRoom;	//公共成员,客厅

private:
	string m_BedRoom;	//私有成员,卧室
};

//通过全局函数实现
void bestFriend(House &house)	//这里使用指针或者引用都可以
{
	cout << "好朋友全局函数 正在访问: " << house.m_SittingRoom << endl;
	cout << "好朋友全局函数 正在访问: " << house.m_BedRoom << endl;
}

void test01()
{
	House house;		//创建一个House类对象
	bestFriend(house);	//调用全局函数访问类中公有和私有成员
}

int main() {
	test01();
	return 0;
}

其中,主要代码就一行:

friend void bestFriend(House& house);

在这里,设置全局函数bestFriend()是House类的友元,然后就可以访问类中的私有成员。

如果没有声明该函数为House类友元,则程序会出现如下报错:
在这里插入图片描述

设置友元后的代码运行结果:
在这里插入图片描述

3.类做友元

​ 类做友元,就是用类B中的函数去调用另一个类A中的私有成员,这需要在类A中将类B做为友元写入。

#include <iostream>
using namespace std;

class House
{
	//设置BestFriend为House类的友元,可以调用House的私有成员
	friend class BestFriend;
public:
	House()
	{
		m_SittingRoom = "客厅";
		m_BedRoom = "卧室";
	}

	string m_SittingRoom;	//公共成员,客厅

private:
	string m_BedRoom;		//私有成员,卧室
};

class BestFriend 
{
public:
	BestFriend()
	{	
		house = new House;	//创建House对象
	}
	void visit()			//参观函数,访问House中的属性
	{
		cout << "好朋友正在访问: " << house->m_SittingRoom << endl;
		cout << "好朋友正在访问: " << house->m_BedRoom << endl;
	}
	
	House* house;
};

void test01()
{
	BestFriend bf;		//创建好友对象
	bf.visit();			//调用好友对象中的函数来访问House中的成员
}

int  main()
{
	test01();
	return 0;
}

其中,主要代码为:

friend class BestFriend;

​ 在这里,设置BestFriend为House类的友元,可以调用House的私有成员。

4.成员函数做友元

成员函数做友元,就是如果要在类B中使用函数去调用类A中的私有内容,需要提前在类A中将该成员函数声明为友元。

#include <iostream>
using namespace std;

class House;	//先声明存在House这样一个类,因为BestFriend类中会调用到该类,而House类中也需要声明将BestFriend设置为友元

class BestFriend {
public:
	BestFriend();	//此处只能先写出声明,需要在House类后再实现,原因与visit函数类似

	void visit();	//让visit函数可以访问House中的私有内容
	/*
	注意!此处不能把函数内容写在此处,将该函数内容移动到House类后面才不会报错
	{
	cout << "visit函数正在访问:" << house->m_SittingRoom << endl;
	cout << "visit函数正在访问:" << house->m_BedRoom << endl;
	}
	*/
	
	void visit2();	//让visit2函数不可以访问House中的私有内容

	House* house;
};

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

public:
	House()
	{
		m_SittingRoom = "客厅";
		m_BedRoom = "卧室";
	}

	string m_SittingRoom;	//公共成员,客厅

private:
	string m_BedRoom;		//私有成员,卧室
};

BestFriend::BestFriend()	//对外实现BestFriend构造方法
{
	house = new House;		//生成一个House类的指针对象house
}

void BestFriend::visit()	//对外实现BestFriend类中visit函数
{
	cout << "visit函数正在访问:" << house->m_SittingRoom << endl;
	cout << "visit函数正在访问:" << house->m_BedRoom << endl;
}

void BestFriend::visit2()	//对外实现BestFriend类中visit2函数
{
	cout << "visit2函数正在访问:" << house->m_SittingRoom << endl;
	//cout << "visit2函数正在访问:" << house->m_BedRoom << endl;	//该行不可实现,因为该visit2函数不是House类的友元
}

int main()
{
	BestFriend bf;
	bf.visit();
	bf.visit2();
	return 0;
}

其中,主要代码为:

friend void BestFriend::visit();

​ 在这里,设置BestFriend类中的visit成员函数是House类的友元,可以访问House类中的私有内容。

注意!

与全局函数做友元所不同的是,类成员函数做友元不能把函数内容直接写在本类中,由于函数中使用到了House类中的私有内容,虽然之前提前声明了House类,但其私有内容还是不能获取,依然会报错提示House类中的私有成员不可访问:

在这里插入图片描述

但是,如果将该函数内容移动到House类后面就不会报错了,就当作顺便学习函数对外实现了吧哈哈~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值