C++友元

C++友元

关键词:friend

生活中你的家有客厅(public),有你的卧室(private)

客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去

但是,你也可以允许你的好友进去

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

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

友元关键字为 friend

友元的三种实现:

全局函数做友元:

核心语句:

friend void goodGay(Building *building);	//位于一个类的最顶端,无需说明此语句所属的权限

参考代码:

#include <iostream>	//友元是一个全局函数
#include <string>
using namespace std;

//建筑物的一个类
class Building
{

	//此处未声明权限(就是写到最上边就可以了后续相同)

	//核心语句:
	//goodGay全局函数是 Building的好朋友,可以访问Building中私有变量
	friend void goodGay(Building *building);	//语法 friend + 全局函数声明

public:
	Building()//创建一个默认构造函数进行初值的构造
	{
		m_SittingRoom = "客厅";
		m_BeRoom = "卧室";
	}


public:
	string m_SittingRoom;//客厅

private:
	string m_BeRoom;//卧室
};

//全局函数做友元
void goodGay(Building *building)
{
	cout << "好基友的全局函数 正在访问:" << building->m_SittingRoom << endl;

	cout << "好基友的全局函数 正在访问:" << building->m_BeRoom<< endl;

}

void test01()
{
	Building building;//创建一个对象 同时调用默认构造函数

	goodGay(&building);
}

int main()
{

	test01();

	system("pause");
	return 0;
}

类做友元:

核心语句:

friend class GoodGay;	//同样位于类中的最上方,无需说明其所处的权限

参考代码:

#include <iostream>		//友元是一个类,此处成员函数在类外进行实现。
#include <string>
using namespace std;//顺带实现了一下类外写成员函数

//类做友元

class Building;//类的声明


class GoodGay
{
public:

	GoodGay();

	void visit();//参观函数 访问Building中的属性

	Building * building;

};

class Building
{
	//核心语句:
	//GoodGay类是本类的好朋友类,可以访问本类中私有的成员
	friend class GoodGay;	//语法 friend + 类的声明

public:
	Building();

public:

	string m_SittingRoom;	//客厅

private:

	string m_BeRoom;		//卧室

};

//类外写成员函数
Building::Building()//默认构造函数
{
	m_SittingRoom = "客厅";
	m_BeRoom = "卧室";
}

GoodGay::GoodGay()//默认构造函数
{
	//创建建筑物对象
	building = new Building;
}


void GoodGay::visit()
{
	cout << "好基友类正在访问:" << building->m_SittingRoom << endl;

	cout << "好基友类正在访问:" << building->m_BeRoom << endl;
}

void test01()
{
	GoodGay G;	//调用两个类的构造函数 (先是GoodGay的,然后由于在GoodGay中有创建一个Building的指针变量)
	G.visit();
}

int main()
{

	test01();

	system("pause");
	return 0;
}

成员函数做友元:

核心语句:

friend void GoodGay::visit();	//相比于上一个类做友元,这里是类中的一个成员函数可以对另一个类的私有成员进行访问
								//所以为了区别 使用了类中的另一个成员函数来与之进行比较。

参考代码:

#include <iostream>	//使用类中的成员函数来作为友元
#include <string>
using namespace std;

class Building;		//类的声明,防止编译器运行时未看到此类定义而报错

class GoodGay		//定义一个好基友的类
{
public:
	GoodGay();

	void visit();	//让visit函数可以访问Building中的私有成员

	void visit2();	//让visit2函数无法访问Building中的私有成员

	Building *building;
};


class Building		//定义一个建筑物的类,想要通过
{
	//核心语句:
	//基友类GoodGay中的成员函数visit是Building的好朋友,可以访问Building中的私有变量
	friend void GoodGay::visit();	//语法:friend+"成员函数的声明"
	//(即要表明这个成员函数是在哪一个类的作用域下)

public:
	Building();

public:

	string m_SittingRoom;

private:

	string m_BeRoom;
};

//在类外实现成员函数
Building::Building()
{
	m_SittingRoom = "客厅";

	m_BeRoom = "卧室";
}

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

void GoodGay::visit()//此成员函数可以访问私有变量
{
	cout << "好基友visit正在访问:" << building->m_SittingRoom << endl;

	cout << "好基友visit正在访问:" << building->m_BeRoom << endl;
}

void GoodGay::visit2()//此成员函数不可以访问私有变量
{
	cout << "visit2正在访问:" << building->m_SittingRoom << endl;

	//cout << "好基友正在访问:" << building->m_BeRoom << endl;  //由于没有设置为友元所以不能访问
}

int main()
{

	GoodGay G;

	G.visit();

	G.visit2();

	system("pause");
	return 0;
}
posted @ 2022-06-21 13:07  如此而已~~~  阅读(51)  评论(0)    收藏  举报
//雪花飘落效果