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

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

    • 1. 友元函数简介
      • 1.1 使用友元函数的目的
      • 1.2 友元函数的三种实现方法
    • 2.全局函数做友元
    • 3.类做友元
    • 4.成员函数做友元
      • 注意!

1. 友元函数简介

1.1 使用友元函数的目的

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

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

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

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

2.全局函数做友元

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

代码如下:

#include 
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类友元,则程序会出现如下报错:
C++友元函数friend使用的学习总结_第1张图片

设置友元后的代码运行结果:
C++友元函数friend使用的学习总结_第2张图片

3.类做友元

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

#include 
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对象
		house = new 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 
using namespace std;

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

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

	void visit();	//让visit函数可以访问House中的私有内容
	/*
	注意!此处不能把函数内容写在此处,由于函数中使用到了House类中的私有内容,虽然上面提前声明了House类,但其私有内容还是不能获取,依然会报错提示未定义类型House::BedRoom不可访问,将该函数内容移动到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()
{
	house = new House;		//生成一个House类的指针对象house
}

void BestFriend::visit()
{
	cout << "visit函数正在访问:" << house->m_SittingRoom << endl;
	cout << "visit函数正在访问:" << house->m_BedRoom << endl;
}

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

void test()
{
	BestFriend bf;
	bf.visit();
	bf.visit2();
}

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

其中,主要代码为:

friend void BestFriend::visit();

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

注意!

与全局函数做友元所不同的是,类成员函数做友元不能把函数内容直接写在本类中,由于函数中使用到了House类中的私有内容,虽然之前提前声明了House类,但其私有内容还是不能获取,依然会报错提示House类中的私有成员不可访问:
C++友元函数friend使用的学习总结_第3张图片
但是,如果将该函数内容移动到House类后面就不会报错了,就当作顺便学习函数对外实现了吧哈哈~

你可能感兴趣的:(c++)