【C++ 中的友元函数:解密其神秘面纱】
友元函数,作为C++中一个重要但常常被误解的概念,经常让初学者感到困惑。本文将带您逐步了解友元函数的含义、用途以及如何正确使用它们。
什么是友元函数?
在C++中,友元函数是一种特殊的函数,它允许某个类或类的成员函数访问另一个类的私有成员。通常,C++中的封装性原则要求类的私有成员只能被该类的成员函数访问,但友元函数打破了这一规则。
为什么需要友元函数?
友元函数有其存在的合理用途。有些时候,我们可能需要让一个独立的函数能够访问某个类的私有数据。这种情况可能包括:
-
操作符重载:当我们需要重载一些操作符,例如
+、<<等,以便它们能够与自定义类一起使用时,友元函数非常有用。 -
提高性能:有时,友元函数可以直接访问类的私有成员,而不需要通过公共接口,从而提高代码的性能。
-
维护旧代码:在将已存在的C代码转化为C++时,友元函数可以用来维护现有的逻辑,而无需大规模重构。
如何定义友元函数?
在C++中,友元函数的定义和声明有一些特殊之处。以下是如何定义一个友元函数的步骤:
- 在要成为友元的类中声明友元函数,通常在类的声明中使用
friend关键字,如下所示:
class MyClass { public:// ...friend void FriendFunction(MyClass&); };
- 在类外部定义友元函数,允许它访问类的私有成员:
void FriendFunction(MyClass& obj) {// 在这里可以访问 MyClass 的私有成员 }
友元函数的限制和注意事项
尽管友元函数有其用途,但它们也有一些限制和注意事项:
-
滥用友元函数是不推荐的:过多地使用友元函数会破坏类的封装性,使代码更难维护。应该只在确实需要的情况下使用友元。
-
友元不具有继承性:友元关系不会继承到子类中。如果派生类需要访问基类的私有成员,需要单独声明友元关系。
-
友元函数可以是全局函数或其他类的成员函数:友元函数不一定要是全局函数,它们也可以是其他类的成员函数。
示例:操作符重载中的友元函数
一个常见的用例是在自定义类中使用友元函数来重载操作符。例如,让我们考虑一个表示复数的类 Complex,我们希望能够重载 + 操作符以便能够执行复数的加法。
class Complex {
private:double real;double imag;
public:Complex(double r, double i) : real(r), imag(i) {}// ...friend Complex operator+(const Complex& lhs, const Complex& rhs);
};Complex operator+(const Complex& lhs, const Complex& rhs) {return Complex(lhs.real + rhs.real, lhs.imag + rhs.imag);
}
在这个示例中,operator+ 函数是一个友元函数,它可以访问 Complex 类的私有成员。
结论
友元函数是C++中的一个强大但需要谨慎使用的特性。通过使用友元函数,您可以让独立的函数访问类的私有成员,从而实现更灵活的编程。然而,滥用友元函数可能会破坏类的封装性,因此需要谨慎使用。了解何时使用友元函数以及如何正确定义它们对于C++编程非常重要。希望本文有助于解开友元函数的神秘面纱,使您能够更好地利用这一特性。
相关文章:
【C++ 中的友元函数:解密其神秘面纱】
友元函数,作为C中一个重要但常常被误解的概念,经常让初学者感到困惑。本文将带您逐步了解友元函数的含义、用途以及如何正确使用它们。 什么是友元函数? 在C中,友元函数是一种特殊的函数,它允许某个类或类的成员函数…...
YOLOv8涨点技巧:手把手教程,注意力机制如何在不同数据集上实现涨点的工作,内涵多种网络改进方法
💡💡💡本文独家改进:手把手教程,解决注意力机制引入到YOLOv8在自己数据集不涨点的问题点,本文提供五种改进方法来解决此问题; ContextAggregation | 亲测在血细胞检测项目中涨点,…...
牛客:FZ12 牛牛的顺时针遍历
FZ12 牛牛的顺时针遍历 文章目录 FZ12 牛牛的顺时针遍历题目描述题解思路题解代码 题目描述 题解思路 通过一个变量来记录当前方向,遍历矩阵,每次遍历一条边,将该边的信息加入到结果中 题解代码 func spiralOrder(matrix [][]int) []int {…...
函数防抖(javaScript)
防抖说明 (1)防抖的目的: 当多次执行某一个动作的时候,限制函数调用的次数,节约资源。 (2)防抖的概念: 函数防抖(debounce):就是指触发事件后&…...
日常学习记录随笔-redis实战
redis的持久化(rdb,aof,混合持久化) redis的主从架构以及redis的哨兵架构 redis的clusterredis 是要做持久化的,一般用redis会把数据放到缓存中为了提升系统的性能 如果redis没有持久化,重启的化数据就会丢失,所有的请…...
MySQL事务MVCC详解
一、概述 MVCC (MultiVersion Concurrency Control) 叫做多版本并发控制机制。主要是通过数据多版本来实现读-写分离,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读,从而提高数据库并发性能。 MVCC只在已提交读(…...
SQL RDBMS 概念
SQL RDBMS 概念 RDBMS是关系数据库管理系统(Relational Database Management System)的缩写。 RDBMS是SQL的基础,也是所有现代数据库系统(如MS SQL Server、IBMDB2、Oracle、MySQL和MicrosoftAccess)的基础。 关系数据库管理系统(Relational Database Management Sy…...
onlyoffice的介绍搭建、集成过程。Windows、Linux
文章目录 什么是onlyoffice功能系统要求安装必备组件 windows搭建资源下载安装数据库onlyoffice安装测试 Linux搭建dockerdocker-compose 项目中用到的技术,做个笔记哈~ 什么是onlyoffice 在本地服务器上安装ONLYOFFICE Docs Community Edition Community Edition…...
37. 解数独
编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空…...
git cherry-pick 合并某次提交
一、无冲突的情况 1、合并其它分支某次提交 切换到主分支,想把其他分支的某次commit修改 合并到主分支上, 可以用 git cherry-pick 命令 比如,其它分支,某次提交的commit Hash 是30e48158badc39801f1ce3cb375a07b872d6f220 &a…...
【面试HOT100】子串普通数组矩阵
系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于LeetCodeHot100进行的,每个知识点的修正和深入主要参考…...
XPSpeak软件教程-科学指南针
在做X 射线光电子能谱(XPS)测试时,科学指南针检测平台工作人员在与很多同学沟通中了解到,好多同学仅仅是通过文献或者师兄师姐的推荐对XPS测试有了解,但是对于其软件操作还属于小白阶段,针对此,科学指南针检测平台团队…...
NLP算法面经 | 腾讯 VS 美团
作者 | 曾同学 编辑 | NewBeeNLP 面试锦囊之面经分享系列,持续更新中 后台回复『面试』加入讨论组交流噢 lz从3月初脚因打球扭伤了开始,投递简历,接二连三的面试鞭尸又面试,昨天才终于上岸了,分享经验~ 腾讯PCG看点&…...
【广州华锐互动】塔吊多人安拆VR互动培训系统
塔吊多人安拆VR互动培训系统由广州华锐互动制作,是一种基于VR技术的模拟实训系统,专门用于培训塔吊驾驶员和操作员。 在现实生活中,塔吊操作具有一定的危险性,尤其是在培训过程中容易发生意外。而使用VR互动实训系统,学…...
Linux性能优化--性能工具:特定进程内存
5.0 概述 本章介绍的工具使你能诊断应用程序与内存子系统之间的交互,该子系统由Linux内核和CPU管理。由于内存子系统的不同层次在性能上有数量级的差异,因此,修复应用程序使其有效地使用内存子系统会对程序性能产生巨大的影响。 阅读本章后&…...
MyLife - Docker安装rabbitmq
Docker安装rabbitmq 个人觉得像rabbitmq之类的基础设施在线上环境直接物理机安装使用可能会好些。但是在开发测试环境用docker容器还是比较方便的。这里学习下docker安装rabbitmq使用。 1. rabbitmq 镜像库地址 rabbitmq 镜像库地址:https://hub.docker.com/_/rabbi…...
Leetcode刷题详解——长度最小的子数组
1. 题目链接:209. 长度最小的子数组 2. 题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度**。**如果不…...
客流人数管理新趋势:景区客流采集分析系统的功能特点
随着旅游业的蓬勃发展,越来越多的人选择前往景区进行休闲和旅游。然而,人流量的增加也给景区管理带来了一系列的挑战。为了更好地管理和运营景区,景区客流采集分析系统应运而生。 一、案例展示 二、产品卖点 该系统利用先进的人工智能算法和…...
【仙逆】王林极限跑酷,藤厉自食恶果,仙逆战斗获好评,张虎命运被改写
Hello,小伙伴们,我是小郑继续为大家深度解析国漫资讯。 最新一集《仙逆》已经更新,相信很多小伙伴都已经先睹为快,在击杀了白展之后,张虎和王林担心其师傅即墨老人报复,因此躲到看似安全的藤家城,以为那里有…...
想要精通算法和SQL的成长之路 - 前缀和的应用
想要精通算法和SQL的成长之路 - 前缀和的应用 前言一. 区域和检索 - 数组不可变二. 二维区域和检索 - 矩阵不可变2.1 前缀和的计算2.2 用前缀和计算二维区域和 三. 矩形区域不超过 K 的最大数值和 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 区域和检索 - 数组不可变 原…...
第八篇:《软件测试的经济学:投入与回报》
在商业环境中,测试不是“免费”的——它需要人力、工具、时间。但缺陷也不是免费的——它可能导致损失、赔偿、用户流失。如何让管理者理解“投入测试是投资,而不是成本”?本文将从经济学角度分析测试的投资回报率(ROI)…...
别再被‘pip不是内部命令’搞懵了!Python新手必看的pip安装与修复保姆级教程(附ensurepip用法)
Python包管理革命:从pip失效到ensurepip的深度实践指南 为什么你的pip命令突然"罢工"了? 刚接触Python的新手们常常会遇到一个令人抓狂的问题——昨天还能正常使用的pip命令,今天突然提示"不是内部或外部命令"。这就像突…...
告别‘断头路’:聊聊DSCNet中那个神奇的拓扑连续性损失函数
告别‘断头路’:DSCNet中拓扑连续性损失函数的深度解析 在医学影像和遥感图像分析中,管状结构(如血管、道路)的精确分割一直是个棘手问题。传统分割网络常产生断裂、毛刺或不连续的结果,这种现象在业内被称为"断…...
高校生最适用的AI论文网站是哪款?
国内高校学生在论文写作中越来越依赖AI工具,目前主流方案以本土化全流程工具为核心,结合通用大模型与专业辅助工具,覆盖选题构思、框架搭建、初稿撰写、内容降重、查重检测以及格式排版等关键环节,以下将深入解析并对比当前最适配…...
StarUML Java插件终极指南:高效实现UML与Java代码双向转换
StarUML Java插件终极指南:高效实现UML与Java代码双向转换 【免费下载链接】staruml-java Java extension for StarUML 项目地址: https://gitcode.com/gh_mirrors/st/staruml-java StarUML Java插件为Java开发者提供了强大的UML建模与代码生成能力ÿ…...
中小团队如何通过TokenPlan套餐实现AI成本可控
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 中小团队如何通过TokenPlan套餐实现AI成本可控 对于中小型创业团队或项目组而言,大模型API的引入能显著提升产品智能化…...
从一次‘迷路’说起:手把手调试LTE终端TAU失败问题(附Wireshark抓包分析)
从一次‘迷路’说起:手把手调试LTE终端TAU失败问题(附Wireshark抓包分析) 清晨的地铁站里,一位工程师盯着手机屏幕上反复跳出的"无服务"提示皱起眉头——这已经是本周第三次收到用户投诉在A区到B区的通勤路上出现信号中…...
如何实现EditorConfig-Sublime与VSCode、IntelliJ的无缝协同工作流
如何实现EditorConfig-Sublime与VSCode、IntelliJ的无缝协同工作流 【免费下载链接】editorconfig-sublime Sublime Text plugin for EditorConfig - Helps developers maintain consistent coding styles between different editors 项目地址: https://gitcode.com/gh_mirro…...
Cacti插件开发实战:从零开始创建自定义插件
Cacti插件开发实战:从零开始创建自定义插件 【免费下载链接】cacti Cacti ™ 项目地址: https://gitcode.com/gh_mirrors/ca/cacti Cacti是一款强大的网络监控和数据采集工具,通过插件系统可以轻松扩展其功能。本文将带你从零开始,掌握…...
一款多功能显示控制器芯片,FHD 120/144Hz,支持最高1920x1080@120Hz.
主要特性特性类别具体规格输入接口1VGA (模拟RGB)、1HDMI 1.4 (带HDCP1.4/2.2)、1DP1.2 组合接口 (兼容HDMI 1.4,带HDCP1.4/2.2)输出接口2 Port LVDS,支持8bit/10bit最大分辨率1920x1200100Hz 或 1920x1080120Hz (带ODC)色彩深度输入:6/8/10b…...
