C++自学笔记

16 友元

本次记录友元,还请各位大佬批评指正!

家里有客厅(public),有卧室(private)。客厅可以让所有来的客人进去,但是卧室是私有的,只有自己能进去。但是也可以让好闺蜜、好基友进去。
在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术。
友元的目的: 让一个函数或者类 访问另一个类中私有成员。
友元的关键字:friend
友元的三种实现:
1、全局函数做友元
2、类做友元
3、成员函数做友元

全局函数做友元

#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;

//全局函数做友元
//建筑物类
class building
{
	//goodgay全局函数是 building的好朋友,可以访问building中的私有成员
	friend void goodgay(building* building);

public:
	building()
	{
		m_sittingroom = "客厅";
		m_bedroom = "卧室";
	}

public:
	string m_sittingroom;//客厅
private:
	string m_bedroom;//卧室

};

//全局函数
void goodgay(building* building)
{
	cout << "好基友的全局函数正在访问:" << building->m_sittingroom << endl;
	cout << "好基友的全局函数正在访问:" << building->m_bedroom << endl;
}

void test01()
{
	building building;
	goodgay(&building);
}

int main()
{
	test01();


	system("pause");

	return 0;
}

类做友元

#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;

//类做友元
class Building;
class Goodgay
{
public:
	Goodgay();

public:

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

	Building * building;

};

class Building
{
	//Goodgay类是本类的好朋友,可以访问本类中的私有成员
	friend class Goodgay;

public:
	Building();

public:
	string m_sittingroom;

private:
	string m_bedroom;
};

//类外写成员函数
Building::Building()
{
	m_sittingroom = "客厅";
	m_bedroom = "卧室";
}

Goodgay::Goodgay()
{
	//创建一个建筑物的对象
	building = new Building;
}

void Goodgay::visit()
{
	cout << "好基友类正在访问: " << building->m_sittingroom << endl;
	cout << "好基友类正在访问: " << building->m_bedroom << endl;
}

void test01()
{
	Goodgay g;
	g.visit();
}

int main()
{
	test01();


	system("pause");

	return 0;
}

成员函数做友元

#include<iostream>
#include <stdlib.h>
#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成员函数作为本类的好朋友,可以访问私有成员
	friend void Goodgay::visit();

public:
	Building();

	string m_sittingroom;

private:
	string m_bedroom;
};

Building::Building()
{
	m_sittingroom = "客厅";
	m_bedroom = "卧室";
}

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

void Goodgay::visit()
{
	cout << "visit 正在访问: " << building->m_sittingroom << endl;
	cout << "visit 正在访问: " << building->m_bedroom << endl;
}

void Goodgay::visit2()
{
	cout << "visit2 正在访问: " << building->m_sittingroom << endl;
	//cout << "visit2 正在访问: " << building->m_bedroom << endl;
}

void test01()
{
	Goodgay g;
	g.visit();
	g.visit2();
}

int main()
{
	test01();

	system("pause");

	return 0;
}
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符 “速评一下”
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页