当前位置: 首页 > news >正文

【带头学C++】----- 九、类和对象 ---- 9.12 C++之友元函数(9.12.1---12.4)

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️创做不易,麻烦点个关注❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

❤️❤️❤️❤️❤️❤️❤️❤️❤️文末有惊喜!献舞一支!❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

目录

9.12 C++之友元函数

9.12.1 友元函数的声明friend

9.12.2 普通全局函数作为类的友元函数

9.12.3 类的某个成员函数作为另外一个类的友元函数

9.12.4 整个类作为另外一个类的友元

点赞👍  + 收藏👐 + 关注👌


9.12 C++之友元函数

问题:什么是友元函数?

        在 C++ 中,友元函数是指在一个类的外部定义的、被该类声明为友元的非成员函数。友元函数可以访问该类的所有成员包括私有成员),并且可以在不通过类对象进行访问的情况下改变成员的值

        类的拥有不同权限访问函数的一个主要特点,即类的私有成员无法在类的外部(作用域之外)访问。但是,我们上一小节文章末尾留下了一个疑惑,在有时候需要在类的外部访问类的私有成员怎么办?
        解决方法是使用友元函数,友元函数是一种特权函数,C++允许这个特权函数访问私有成员。这一点从现实生活中也可以很好的理解。比如你的钱是你个人私有的,你家里人拿你的钱你是可以允许的,但是一个陌生人来拿你的钱,你就不能直接给他了。这时候你家人出来一个说这是他的律师来,是他的朋友,拿了一个东西证明了这个关系(friend == 合法合同、或者律师证,或者你的电话,或者你本人,用来证明你们朋友关系的纽带),这样就可以把你个人的钱给他了。我们可以把一个全局函数、某个类中的成员函数、甚至整个类声明为友元。

     (👮👮👮这里提醒大家,不要轻易给陌生人转账、发红包、汇款等,任何!所有!一切!让你先转账才可以得到什么的理由!!!都是诈骗!!!并且不是通过购物平台或者官方的平台的,私人的那种,而且交易方式没有实名等!都是骗子!警惕诈骗,转账之前一定要确认对方是否是你认识的人,或者是你的家人等等。警防网络诈骗,让骗子无处可骗。防诈骗从每个人做起👮👮👮)

        特别的:友元函数会破坏类的封装性😭,因为私有数据可以被外部访问到

9.12.1 友元函数的声明friend

        友元函数使用friend关键字声明一个函数为友元函数。

        friend关键字只使用于声明处,一个函数或者是类对象作为另外一个类的友元,例如A类作为B类的友元,那么A类可以直接访问B类中的私有数据。

        友元比较着重运用在运算符重载上。

9.12.2 普通全局函数作为类的友元函数

这里我们使用了一个案例举例:是在千锋教育C++嵌入式基础班讲解(后续案例用qf缩写代替)的一个案例:例如你的家,有客厅,有你的卧室,那么你的客厅是Public的,所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去,但是呢,你也可以允许你的好闺蜜、好基友进去参观你的卧室(基于正常情况,防止杠精)。

1.当不是友元的时候,访问私有成员会报错的

当使用相同名字的时候,声明为友元函数的时候,公共函数visitingfun()就没有报错。 

完整案例+结果

代码:

#include <iostream>
#include <string>
using namespace std;class Room
{friend void visitingfun(Room &room);
private:string bedRoom;//卧室public:
public:string setingRoom;//客厅pubTic:
public:Room(string bedRoom, string setingRoom){this->bedRoom = bedRoom;this->setingRoom = setingRoom;}
};
//普通全局函数
void visitingfun(Room &room){cout<<"访问了"<<room.setingRoom<<endl;cout<<"访问了"<<room.bedRoom<<endl;
}
void test01(){Room room("私人豪华大床房卧室","公共188大平层客厅");visitingfun(room);
}
int main()
{test01();return 0;
}

9.12.3 类的某个成员函数作为另外一个类的友元函数

这个案例中,goodfriens类中的vistinng_02成员函数作为Room1类的友元函数。此时就是不同类的成员,进行一个私有成员变量的访问。

拓展:

 上面的案例中,成员函数声明和定义顺序比较关键,总所周知,程序是向下编译的,顺序执行。

那看下面这个图片中:成员函数放到类对象里,此时报错原因,即使你提前声明了Room1,但是由于初始化阶段,还没有生成Room1的成员,此时编译器是不知道Room1里面有什么成员的。所以此时报错了。

另外,goodfriends的声明也应该在Room1声明之前(这里仅仅针对9.12.3主题来说,因为你要的是成员函数) ,编译器提前声明只是知道了一个名字,编译顺序始终是从上往下执行的。

所以,你要把类中要成为友元函数的成员函数,定义实现放在外面,放在所有类的声明的后面就行了。

9.12.4 整个类作为另外一个类的友元

        就是这个类的所有成员函数都可以访问另一个类的私有数据。

并且,声明的顺序可成员函数的基本一致。

 代码:

class Room1;//向前声明方式,这样只能说明类的名称
class goodfrieds
{
public:void visiting_01(Room1 &room);void visiting_02(Room1 &room);};
class Room1{//friend void goodfrieds::visiting_02(Room1 &room);friend class goodfrieds;
private:string bedRoom;//卧室public:
public:string setingRoom;//客厅pubTic:
public:Room1(string bedRoom, string setingRoom){this->bedRoom = bedRoom;this->setingRoom = setingRoom;}
};
void goodfrieds::visiting_01(Room1 &room){cout<<"访问了01"<<room.setingRoom<<endl;cout<<"访问了01"<<room.bedRoom<<endl;
}
void goodfrieds::visiting_02(Room1 &room){cout<<"访问了02"<<room.bedRoom<<endl;cout<<"访问了02"<<room.setingRoom<<endl;
}
void test03(){Room1 room("私人豪华大床房卧室","公共188大平层客厅");goodfrieds ob;ob.visiting_01(room);ob.visiting_02(room);
}
int main()
{test03();return 0;
}

点赞👍  + 收藏👐 + 关注👌

❤️您的支持❤️是我最大的动力❤️相互学习❤️共同进步❤️一起搞钱❤️动动发财的小手❤️

  ⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️十星好评,Erike的专用模板⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️

谢     谢     老     板!老     板     大     气!

相关文章:

【带头学C++】----- 九、类和对象 ---- 9.12 C++之友元函数(9.12.1---12.4)

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️创做不易&#xff0c;麻烦点个关注❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ ❤️❤️❤️❤️❤️❤️❤️❤️❤️文末有惊喜&#xff01;献舞一支&#xff01;❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ 目录 9.12…...

设计模式的定义

1 组合模式: 整体-部分模式,它是一种将对象组合成树状层次结构的模式,用来表示整体和部分的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式 1.1 特点: 组合模式使得客户端代码可以一致的处理单个对象和组合对象更容易在组合体内加入新的对象,客户端不…...

【Kubernetes】存储类StorageClass

存储类StorageClass 一、StorageClass介绍二、安装nfs provisioner&#xff0c;用于配合存储类动态生成pv2.1、创建运行nfs-provisioner需要的sa账号2.2、对sa授权2.3、安装nfs-provisioner程序 三、创建storageclass&#xff0c;动态供给pv四、创建pvc&#xff0c;通过storage…...

【LLM】大模型之RLHF和替代方法(DPO、RAILF、ReST等)

note SFT使用交叉熵损失函数&#xff0c;目标是调整参数使模型输出与标准答案一致&#xff0c;不能从整体把控output质量&#xff0c;RLHF&#xff08;分为奖励模型训练、近端策略优化两个步骤&#xff09;则是将output作为一个整体考虑&#xff0c;优化目标是使模型生成高质量…...

Spring Boot监听redis过期的key

Redis支持过期监听&#xff0c;可以实现监听过期数据&#xff0c;实现过程如下 1、pom依赖 <!-- Redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></depend…...

day01、什么是数据库系统?

数据库系统介绍 1.实例化与抽象化数据库系统2.从用户角度看数据库管理系统的功能2.1 数据库定义功能2.2 数据库操纵2.3 数据库控制2.4 数据库维护功能2.5 数据库语言与高级语言 3.从系统&#xff1a;数据库管理系统应具有什么功能 来源于战德臣的B站网课 1.实例化与抽象化数据库…...

2023年医疗器械行业分析(京东医疗器械运营数据分析):10月销额增长53%

随着我国整体实力的增强、国民生活水平的提高、人口老龄化、医疗保障体系不断完善等因素的驱动&#xff0c;我国的医疗器械市场增长迅速。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年10月份&#xff0c;京东平台上医疗器械市场的销量将近1200万&#xff0c;环比…...

MISRA C++ 2008 标准解析

MISRA C 2008是《汽车专用软件的C语言编程指南》&#xff0c;是针对C语言的安全编码标准&#xff0c;适用C 03标准&#xff0c;是汽车行业公认的C语言编码规范&#xff0c;目的是在研发生命周期早期发现软件中的缺陷&#xff0c;预防成本投入会大幅度降低投产后的售后维护成本。…...

Linux16 ftp文件服务区、vsftpd文件系统服务安装、lftp客户端安装、NFS远程共享存储

目录 一、FTP基础ftp主动模式ftp被动模式 二、vsftpd配置共享目录编辑配置文件使用windows 访问 三、客户端安装 &#xff08;lftp&#xff09;匿名用户的一些操作&#xff08;lftp {ip}&#xff09;ftp配置本地用户登录配置本地用户ftp配置文件 lftp操作 NFS远程共享存储安装n…...

[排序篇] 冒泡排序

目录 一、概念 二、冒泡排序 2.1 冒泡降序(从大到小排序) 2.2 冒泡升序(从小到大排序) 三、冒泡排序应用 总结 一、概念 冒泡排序核心思想&#xff1a;每次比较两个相邻的元素&#xff0c;如果它们不符合排序规则&#xff08;升序或降序&#xff09;则把它们交换过来。…...

CGAL的四面体网格重构

1、多材料各向同性四面体网格重构 此软件包实现了等人提出的四边形网格质量重分算法。这种实用的迭代重分网格算法旨在通过迭代执行一系列基本操作来重分多材料四边形网格&#xff0c;这些操作包括边缘分裂、边缘折叠、边缘翻转和顶点重定位&#xff0c;这些操作是在拉普拉斯平…...

排序-选择排序与堆排序

文章目录 一、选择排序二、堆排序三、时间复杂度四、稳定性 一、选择排序 思想&#xff1a; 将数组第一个元素作为min&#xff0c;然后进行遍历与其他元素对比&#xff0c;找到比min小的数就进行交换&#xff0c;直到最后一个元素就停止&#xff0c;然后再将第二个元素min&…...

d2l绘图不显示的问题

之前试了各种方法都不行 在pycharm中还是不行&#xff0c;但是在anaconda中的命令行是可以的 anaconda prompt conda activaye py39 #进入f盘 F: #运行文件 python F:\python_code\softmax.py...

智能优化算法应用:基于人工蜂群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工蜂群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工蜂群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂群算法4.实验参数设定5.算法结果6.…...

云原生的 CI/CD 框架tekton - Trigger(二)

上一篇为大家详细介绍了tekton - pipeline&#xff0c;由于里面涉及到的概念比较多&#xff0c;因此需要好好消化下。同样&#xff0c;今天在特别为大家分享下tekton - Trigger以及案例演示&#xff0c;希望可以给大家提供一种思路哈。 文章目录 1. Tekton Trigger2. 工作流程3…...

maven环境搭建

maven历史版本下载&#xff1a;https://archive.apache.org/dist/maven/ 新建系统变量编辑Path&#xff0c;添加bin目录mvn -v测试查看版本号conf目录下新建repository文件夹&#xff0c;作为本地仓库 settings.xml <?xml version"1.0" encoding"UTF-8&…...

利用Rclone将阿里云对象存储迁移至雨云对象存储的教程,对象存储数据迁移教程

使用Rclone将阿里云对象存储(OSS)的文件全部迁移至雨云对象存储(ROS)的教程&#xff0c;其他的对象存储也可以参照本教程。 Rclone简介 Rclone 是一个用于和同步云平台同步文件和目录命令行工具。采用 Go 语言开发。 它允许在文件系统和云存储服务之间或在多个云存储服务之间…...

二叉树的前序遍历

问题描述&#xff1a; 给你二叉树的根节点root&#xff0c;返回节点值的前序遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;ro…...

final的安全发布

final的安全发布 两个关键字“发布”“安全” 所谓发布通俗一点的理解就是创建一个对象&#xff0c;使这个对象能被当前范围之外的代码所使用 比如Object o new Object(); 然后接下来使用对象o 但是对于普通变量的创建&#xff0c;之前分析过&#xff0c;大致分为三个步骤&am…...

3易懂AI深度学习算法:长短期记忆网络(Long Short-Term Memory, LSTM)生成对抗网络 优化算法进化算法

继续写&#xff1a;https://blog.csdn.net/chenhao0568/article/details/134920391?spm1001.2014.3001.5502 1.https://blog.csdn.net/chenhao0568/article/details/134931993?spm1001.2014.3001.5502 2.https://blog.csdn.net/chenhao0568/article/details/134932800?spm10…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...