C++核心编程——P36-友元

2023-09-20 20:25:16

友元

客厅就是Public,你的卧室就是Private

客厅所有人都可以进去,但是你的卧室只有和你亲密的人可以进。

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

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

友元的关键字——friend

友元的三种实现

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

         就是将此函数在类的最上面写一个声明,前面加一个friend。

#include<iostream>
#include<string>
using namespace std;
class Building 
{
	//goodgay全局函数是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 test()
{
	Building building;
	goodgay(&building);
}
int main(void)
{
	test();
	system("pause");
	return 0;
}

2.类做友元

       一个类在另一个中friend class xx。

#include<iostream>
#include<string>
using namespace std;
//在前面先声明一下
class Building;

class GoodGay
{
public:
	GoodGay();
public:
	void visit();//参观函数 访问Building中的属性(公共属性和私有)
	Building* building;
};


class Building
{
	//GoodGay是Building类的好朋友,可以访问其私有属性
	friend class GoodGay;
public:
	Building();
public:
	string m_SittingRoom;
private:
	string m_BedRoom;
};
//在类外写成员函数
Building::Building()
{
	m_SittingRoom = "客厅";
	m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
	//创建一个Building对象
	building = new Building;
}
void GoodGay::visit()
{
	cout << "好基友正在访问你的" << building->m_SittingRoom << endl;
	cout << "好基友正在访问你的" << building->m_BedRoom << endl;
}

void test()
{
	GoodGay gy;
	gy.visit();
}
int main(void)
{
	test();
	system("pause");
	return 0;
}
//在你的代码中,building = new Building; 是在 GoodGay 类的构造函数 GoodGay::GoodGay() 中创建了一个 Building 类的对象,然后将其地址存储在 GoodGay 类的 building 成员变量中。

具体解释如下:

GoodGay::GoodGay() 构造函数:

这是 GoodGay 类的构造函数,它在 GoodGay 类的对象被创建时调用。
在构造函数内部,building = new Building; 执行了动态内存分配操作,创建了一个新的 Building 类的对象,并返回该对象的地址。
这个地址被存储在 GoodGay 类的 building 成员变量中,因此 building 成员变量现在指向了一个新的 Building 对象。
Building::Building() 构造函数:

这是 Building 类的构造函数,用于初始化 Building 类的对象。
在构造函数内部,m_SittingRoom 和 m_BedRoom 成员变量都被初始化为特定的字符串值。
所以,building = new Building; 的目的是在 GoodGay 对象被创建时,同时创建了一个关联的 Building 对象,以便 GoodGay 对象可以访问 Building 对象的成员变量,包括 m_SittingRoom 和 m_BedRoom。这种关系通常用于表示两个类之间的友好关系,允许一个类的成员函数访问另一个类的私有成员。在你的代码中,GoodGay 类被声明为 Building 类的好朋友(friend class GoodGay;),因此它可以访问 Building 类的私有成员。
3.成员函数做友元

告诉编译器 另一个类中的xx成员函数作为本类的好朋友,可以访问私有函数。

#include<iostream>
#include<string>
using namespace std;

class Building;
class GoodGay
{
public:
	GoodGay();
	void visit();//可以访问Building中私有成员
	void visit1();//不可以访问Building中私有成员
	Building* builidng;	
};
class Building
{
	//告诉编译器 GoodGay类中的visit成员函数作为本类的好朋友,可以访问私有函数
	friend void GoodGay::visit();
public:
	Building(); 
public:
	string m_SittingRoom;
private:
	string m_BedRoom;
};

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

GoodGay::GoodGay()
{

	builidng = new Building;
}
void GoodGay::visit()
{
	cout << "visit正在访问" << builidng->m_SittingRoom << endl;
	cout << "visit正在访问" << builidng->m_BedRoom << endl;
}
void GoodGay::visit1()
{
	cout << "visit1正在访问" << builidng->m_SittingRoom << endl;

}
void test()
{
	GoodGay gg;
	gg.visit();
	gg.visit1();
}
int main(void)
{
	test();
	system("pause");
	return 0;
}

更多推荐

基于minist数据集用VAE训练生成图片(VAE基础入门学习)

文章目录参考的代码VAE介绍代码实现与解读代码块累计损失函数的变化迭代100次后生成的图像参考的代码复现的代码VAE介绍VAE是变分自编码器(VariationalAuto-Encoder)的缩写。它是一种深度生成模型,由Kingma等人于2014年提出的基于变分贝叶斯(VariationalBayes,VB)推断的生

Spark on YARN 部署搭建详细图文教程

目录一、引言二、SparkOnYarn本质2.1SparkOnYarn的本质?2.2SparkOnYarn需要啥?三、配置sparkonyarn环境3.1spark-env.sh3.2连接到YARN中3.2.1bin/pyspark3.2.2bin/spark-shell3.2.3bin/spark-submit(PI

怎么将视频压缩变小?

&nbsp;&nbsp;怎么将视频压缩变小?随着互联网行业的额不断进步和短视频平台的日益流行,视频文件已经成为我们生活不可或缺的一部分。然而,在使用视频文件的过程中,我们可能会遇到一个棘手的问题:视频文件过大,无法轻松地进行传输或存储。文件过大是视频使用过程中不可避免的事情,尤其是现在拍摄设备的愈发先进,让拍摄的视频越

Java + Selenium + Appium自动化测试

一、启动测试机或者Android模拟器(Genymotion俗称世界上最快的模拟器,可自行百度安装)二、启动Appium(Appium环境安装可自行百度)三、安装应用到Genymotion上,如下图我安装一个计算机的小应用,包名为CalcTest.apk安装步骤:(基于AndroidSDK已经配置好了环境变量,可自行百

Linux Ubuntu命令行快速配置C++开发环境

本文介绍在Linux操作系统的Ubuntu版本中,基于命令行,快速配置C++编辑、编译、运行的代码开发环境的简便方法。在之前的文章Linux操作系统Ubuntu22.04配置VisualStudioCode与C++代码开发环境的方法(https://blog.csdn.net/zhebushibiaoshifu/art

7.4.4 【MySQL】索引字符串值的前缀

我们知道一个字符串其实是由若干个字符组成,如果我们在MySQL中使用utf8字符集去存储字符串的话,编码一个字符需要占用1~3个字节。假设我们的字符串很长,那存储一个字符串就需要占用很大的存储空间。在我们需要为这个字符串列建立索引时,那就意味着在对应的B+树中有这么两个问题:B+树索引中的记录需要把该列的完整字符串存储

DP4306F—Sub-1G无线收发通信芯片

DP4306F是一款高性能低功耗的单片集成收发机,工作频率可覆盖200MHz~1000MHz,集成M0核MCU,支持230/408/433/470/868/915频段。该芯片集成了射频接收器、射频发射器、频率综合器、GFSK调制器、GFSK解调器等功能模块。通过SPI接口可以对输出功率、频道选择以及数据包格式进行灵活配

从Langchain到ReAct,在大模型时代下全新的应用开发核心

简介:什么是ReAct框架关于什么是langchain,可以参考:https://ata.alibaba-inc.com/articles/266839?spm=ata.23639420.0.0.1dea7536uD7yhh在使用langchain的过程中,大模型给人留下最深刻的印象无疑是Agent功能。大模型会自己分

hive操作

Hive启动类功能说明命令启动hiveserver2服务bin/hiveserver2启动beelinebin/beeline连接hiveserver2beeline>!connectjdbc:hive2://hadoop102:10000metastroe服务bin/hive--servicemetastorehiv

【EI会议】第二届声学,流体力学与工程国际学术会议(AFME 2023)

第二届声学,流体力学与工程国际学术会议20232ndInternationalConferenceonAcoustics,FluidMechanicsandEngineering(AFME2023)声学、流体力学两个古老的学科发展至今,无时无刻都在影响着我们的生活。小到日常使用的耳机、风扇,大到制造的轮船、飞机。时代发

学习记忆——宫殿篇——记忆宫殿——记忆桩——单间+客厅+厨房+厕所+书房+院子

文章目录单间客厅厨房厕所书房院子单间水壶水龙头香皂果汁机电视门空间花红酒葡萄不锈钢白毛沙发彩色垫子吉他皮椅挂画风扇糖抱枕盒子花土水晶腿衣柜笔三环相框水壶壁挂台灯被网球拍足球抽屉闹钟蝴蝶心斑马三轮车音响椅子碗玩偶烟灰缸电视窗帘玻璃上铺镜子壁灯枕头电话纸盘鱼长方形镜子垃圾桶电视柜地板砖折叠凳窗帘挂坠毯子竹节式台灯台灯床头床

热文推荐