C++学习Day04之关键字friend(友元)

目录

  • 一、程序及输出
    • 1.1 全局函数做友元函数
    • 1.2 类作为友元类
    • 1.3 成员函数作为友元函数
  • 二、分析与总结


一、程序及输出

1.1 全局函数做友元函数

goodGay全局函数作为本类好朋友,可以访问私有成员

#include
using namespace std;
#include 

class Building
{
	//利用friend关键字让全局函数  goodGay作为本类好朋友,可以访问私有成员
	friend void goodGay(Building * buliding);

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

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

//好基友全局函数  可以访问Building的私有属性
void goodGay( Building * buliding)
{
	cout << "好基友正在访问:" << buliding->m_SittingRoom << endl;

	cout << "好基友正在访问:" << buliding->m_BedRoom << endl;
}

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

int main(){
	test01();
	system("pause");

	return EXIT_SUCCESS;
}

输出:
C++学习Day04之关键字friend(友元)_第1张图片

1.2 类作为友元类

让GoodGay类作为好朋友,可以访问Building类的私有成员

#include
using namespace std;
#include 
class Building;
class GoodGay
{
public:

	GoodGay();

	void visit();

	Building * m_building;
};

class Building
{
	//让goodGay类作为 Building的好朋友,可以访问私有成员
	friend class GoodGay;

public:
	Building();

	string m_SittingRoom;

private:
	string m_BedRoom;
};

Building::Building()
{
	this->m_SittingRoom = "客厅";
	this->m_BedRoom = "卧室";
	cout << "构造函数" << endl;
}

GoodGay::GoodGay()
{
	this->m_building =  new Building;
}

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

void test01()
{
	GoodGay gg;
	gg.visit();
}

int main(){
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

输出:
C++学习Day04之关键字friend(友元)_第2张图片

1.3 成员函数作为友元函数

让GoodGay类中的 visit成员函数作为友元函数,可以访问Building类的私有成员

#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
#include 
class Building;
class GoodGay
{
public:

	GoodGay();

	void visit(); //可以访问building的私有

	void visit2(); // 不可以访问building的私有

	Building * m_building;
};

class Building
{
   //让GoodGay类中的 visit成员函数作为友元
   friend void GoodGay::visit();
public:
	Building();

	string m_SittingRoom;

private:
	string m_BedRoom;
};

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

GoodGay::GoodGay()
{
	this->m_building = new Building;
}

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

void GoodGay::visit2()
{
	cout << "好基友正在访问: " << this->m_building->m_SittingRoom << endl;
	//cout << "好基友正在访问: " << this->m_building->m_BedRoom << endl;//无权限
}


void test01()
{
	GoodGay gg;
	gg.visit();
	gg.visit2();
}

int main(){
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

输出:
C++学习Day04之关键字friend(友元)_第3张图片


二、分析与总结

friend 关键字用于声明一个函数或类为另一个类的友元,从而允许友元函数或类访问被声明为友元的类的私有成员和保护成员。以下是关于 friend 关键字的概括总结:

友元函数:使用 friend 关键字可以将一个函数声明为另一个类的友元函数,使得该函数可以访问该类的私有成员和保护成员。
友元类:使用 friend 关键字也可以将一个类声明为另一个类的友元类,使得该类可以访问被声明为友元的类的私有成员和保护成员。
单向性:友元关系是单向的,如果类 A 将类 B 声明为友元,则类 B 并不会自动将类 A 声明为友元。
封装性:友元关系是一种破坏封装性的行为,因此应该谨慎使用。通常情况下,应该尽量避免使用友元,而是通过提供公共接口来访问类的私有成员。
使用场景:友元通常用于需要访问类的私有成员但又不适合通过公共接口来实现的情况,例如重载操作符、实现某些特定的算法等。

你可能感兴趣的:(C++,c++,学习)