友元是一种允许某些外部函数或类访问另一个类的成员的机制

在C++编程语言中,“友元”(Friend)是一种允许某些外部函数或类访问另一个类的私有(private)和保护(protected)成员的机制。友元功能在C++中是非常有用的,尤其是在实现某些特定的功能时,比如操作符重载或者某些需要深入访问类内部的工具函数。

1. 友元函数

友元函数不是类的成员函数,但它可以访问类的所有私有(private)和保护(protected)成员。你可以在类中声明某个函数为友元,这样就允许这个函数访问类的非公开成员。

示例代码:

class Box {
private:double width;
public:double length;void setWidth(double wid) {width = wid;}friend void printWidth(Box box);
};void printWidth(Box box) {/* 因为printWidth是Box的友元,它可以直接访问私有成员 */std::cout << "Width of box : " << box.width << std::endl;
}

在这个示例中,printWidth函数是Box类的一个友元,所以它可以访问Box类的私有成员width

2. 友元类

当一个类被声明为另一个类的友元时,这个类的所有成员函数都可以访问另一个类的私有和保护成员。

示例代码:

class Box {
private:double width;
public:double length;friend class Printer;
};class Printer {
public:void printWidth(Box& b) {std::cout << "Width of box: " << b.width << std::endl;}
};

在这个示例中,Printer类是Box类的友元,因此Printer中的成员函数printWidth可以访问Box的私有成员width

3. 友元的使用原则和考虑

友元机制虽然强大,但使用时应谨慎,因为它破坏了类的封装和隐藏信息的原则。合理使用友元可以使得代码更加灵活和强大,但过多地使用友元会使得代码的维护变得困难,因为它创建了一个外部类或函数与类的非公开信息之间的依赖。

在设计类的接口时,应优先考虑使用公有成员函数来提供必要的服务,只在无法避免的情况下使用友元,例如操作符重载或某些特定的函数需要深入访问类的私有部分。

结论

友元是C++中的一个强大特性,它提供了一种机制来允许特定的外部函数或类访问私有和保护成员。正确使用友元可以增强程序的功能性和灵活性,但应谨慎使用以避免破坏封装性和增加代码的复杂度。在设计类和功能时,合理利用友元,可以使得C++程序更加有效和高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

替换掉Springboot框架中的Tomcat,使用undertow

替换掉Springboot框架中的Tomcat&#xff0c;使用undertow 1、前言2、四种WEB服务器介绍2.1、Tomcat2.2、Undertow2.3、Jetty2.4、Netty 3、如何替换Tomcat&#xff1f;并使用Undertow3.1、pom修改 4、参考目录 1、前言 在SpringBoot框架中&#xff0c;我们使用最多的是Tomcat&…

【前段】开发五子棋小游戏全流程

使用前端技术开发五子棋小游戏 在这篇博文中&#xff0c;我们将详细介绍如何使用HTML、CSS和JavaScript开发一个简单的五子棋小游戏。我们将展示如何初始化棋盘、处理用户交互以及实现胜负判定。特别是&#xff0c;我们将着重介绍胜负判定的逻辑实现。 完整代码我放在了这里&a…

push to origin/master was rejected解决方案之一

如果你是git小白&#xff0c;并且其他帖子的方法都不行&#xff0c;可以一试 在你的远程库&#xff08;我这个是gitee&#xff09;设置中的邮箱设置里不勾这个选项 然后就没有然后了。

html标签属性解析

jar包 <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.13.1</version> </dependency> 解析方法 private String parseOriginUrl(String tzurl) { if (StrUtil.isEmpty(tzurl)) { retu…

宣布推出 Search AI Lake 和 Elastic Cloud Serverless 以扩展低延迟搜索

作者&#xff1a;来自 Elastic Ken Exner 今天&#xff0c;我们很高兴地宣布 Search AI Lake 和 Elastic Cloud Serverless。 Search AI Lake 是一种针对实时应用程序进行优化的开创性云原生架构&#xff0c;它将扩展的存储容量与低延迟查询以及 Elasticsearch 强大的搜索和 AI…

26 | MQTT协议:如何支持海量的在线IoT设备?

MQTT 和其他消息队列的传输协议有什么不同&#xff1f; 从宏观上来说&#xff0c;MQTT 和其他消息队列采用的传输协议是差不多的。它采用的也是发布 - 订阅的消息模型。网络结构上&#xff0c;也是 C/S 架构&#xff0c;IoT 设备是客户端&#xff0c;Broker 是服务端&#xff…

视频监控平台智能边缘分析一体机视频存储平台打手机检测算法

智能边缘分析一体机的打手机检测算法是一种集成了先进图像处理、计算机视觉和人工智能技术的解决方案&#xff0c;专门用于实时监测和识别监控场景中的打手机行为。 在提到“打手机检测算法”时&#xff0c;可能是指一种能够识别和检测使用手机行为的算法。这种算法可以应用于多…

winform,子线程里messagebox如何模态阻止ui线程

在WinForms中&#xff0c;如果你想在子线程中显示一个MessageBox并阻止UI线程&#xff0c;可以使用Invoke或BeginInvoke方法来确保MessageBox是在UI线程上显示的。这是因为WinForms控件不是线程安全的&#xff0c;所有的UI操作都应该在UI线程上进行。 以下是一个示例代码&…

力扣HOT100 - 300. 最长递增子序列

解题思路&#xff1a; 动态规划 class Solution {public int lengthOfLIS(int[] nums) {if (nums.length 0) return 0;int[] dp new int[nums.length];int max 0;Arrays.fill(dp, 1);for (int i 0; i < nums.length; i) {for (int j 0; j < i; j) {if (nums[j] <…

文字生成数字员工!实在AI Agent化身“六边形战士”落地千行百业

2023年8月&#xff0c;实在智能在全行业首发“一句话生成数字员工”的实在AI Agent智能体产品&#xff0c;即实在Agent智能体&#xff0c;也是TARS-RPA Agent智能体数字员工&#xff0c;其同时具备LLM大模型的对话式交互能力和RPA的流程自动化能力&#xff0c;有“大脑”&#…

C# .Net8 switch 的用法

在 .net 8中&#xff0c;switch 不需要再和传统的写法一样了&#xff0c;会更加的方便 创建一个 .net 8 控制台项目 switch 的写法没必要和以前一样 namespace SwitchTest {internal class Program{static void Main(string[] args){int day 3;var week day switch{1 > &…

Go语言不再难!跟随ChatGPT轻松攻克编程难关

开发人员&#xff08;包括我在内&#xff09;通常偏好边学习边实践的方式。这不仅仅是我与LLM协作的核心准则之一&#xff0c;也是最关键的准则&#xff1a;因为你是在任务导向的学习过程中积累知识&#xff0c;这种学习方式不是预先的——它基于实时的、可感知的情境。 当资深…

安防监控视频平台EasyNVR级联视频上云系统EasyNVS出现“Login error”报错

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力&#xff0c;能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、W…

##21 深入理解文本处理:使用PyTorch进行NLP基础操作

文章目录 前言简介文本预处理实现分词构建词汇表 文本向量化构建简单的文本分类模型结论 前言 在现代深度学习应用中&#xff0c;文本处理是不可或缺的一部分&#xff0c;尤其在自然语言处理&#xff08;NLP&#xff09;领域。借助强大的框架如PyTorch&#xff0c;我们可以更加…

一篇文章搞懂退火算法

退火算法,全称为模拟退火算法(Simulated Annealing,SA),是一种通用概率算法,用来在给定一个大的搜寻空间内找寻问题的近似最优解。模拟退火算法灵感来源于固体物理学中的退火过程,这一过程中,物质被加热后再缓慢冷却,原子会在加热过程中获得较大的运动能量,随着温度的…

KIOXIA CD8P-R 1.92TB SSD KCD81PUG1T92数据中心读密集型

KIOXIA全新推出的CD8P-R系列数据中心级读密集型SSD - KCD81PUG1T92型号。这款SSD不仅在性能和可靠性方面表现出色,还能为您的数据中心应用带来前所未有的体验。 首先,让我们一起来看看KCD81PUG1T92的关键亮点: 超高性能: KCD81PUG1T92采用PCIe 5.0和NVMe 2.0规范,最高可提供…

JSpdf,前端下载大量表格数据pdf文件,不创建dom

数据量太大使用dom》canvas》image》pdf.addimage方法弊端是canvas超出 浏览器承受像素会图片损害&#xff0c;只能将其切割转成小块的canvas,每一次调用html2canvas等待时间都很长累积时间更长&#xff0c;虽然最终可以做到抽取最小dom节点转canvas拼接数据&#xff0c;但是死…

Linux基础之进程的优先级

目录 一、进程优先级的概念 二、进程优先级的查看 三、怎么修改进程优先级 四、进程饥饿 一、进程优先级的概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linu…

Redis教程(三):Redis的五种基本数据类型

String&#xff08;字符串&#xff09; 字符串 String 是 Redis 最简单的数据结构&#xff0c;可以存储字符串、整数或者浮点数&#xff0c;常用于存储对象。 List&#xff08;列表&#xff09; 列表List相当于 Java 语言里面的 LinkedList&#xff0c;插入性能高&#xff0…

特征衍生-多变量交叉组合特征衍生

https://www.bilibili.com/video/BV1Kg411n7jv?p21&vd_source08e23da22e328e8950aeb24d2001d586