C++ 入门09:友元函数和友元类

往期回顾:

C++ 入门06:类的进阶(构造函数的重载与拷贝构造函数)-CSDN博客

C++ 入门07:静态成员和常量成员-CSDN博客

C++ 入门08:运算符重载-CSDN博客


一、前言

在前面文章的学习中,我们了解了类和对象的基础知识、构造函数、拷贝构造函数、静态成员、常量成员以及运算符重载。今天,我们将学习 C++ 中的友元函数和友元类。友元使得非成员函数或其他类可以访问类的私有成员,从而提高了类的灵活性和可扩展性。

二、友元函数和友元类

 2.1、 友元函数

(1)什么是友元函数?

友元函数(Friend Function)是一个被指定为某个类的友元的函数,尽管它不是该类的成员,但它可以访问该类的私有成员和保护成员。这种机制为类的封装性提供了一种灵活的补充,通过友元函数,我们可以在类的外部定义一些操作,即使不破坏类的封装性,仍然能够访问类的内部数据。

(2)声明友元函数

要在类中声明一个友元函数,你需要在类的定义体内部,使用friend关键字后跟友元函数的声明。friend关键字告诉编译器,这个特定的函数是类的友元,因此可以访问类的私有和保护成员。

语法:

class ClassName {friend 返回类型 函数名(参数列表);
};

示例:

假设我们有一个表示点的 Point 类,我们希望定义一个函数来计算两点之间的距离。由于距离计算涉及访问点的私有成员变量,因此我们可以将这个函数声明为 Point 类的友元函数。

#include <iostream>
#include <cmath>
using namespace std;class Point {
private:double x, y;public:Point(double x = 0, double y = 0) : x(x), y(y) {}// 声明友元函数friend double distance(const Point &p1, const Point &p2);
};// 定义友元函数
double distance(const Point &p1, const Point &p2) {double dx = p1.x - p2.x;double dy = p1.y - p2.y;return sqrt(dx * dx + dy * dy);
}int main() {Point p1(3.0, 4.0);Point p2(0.0, 0.0);cout << "Distance: " << distance(p1, p2) << endl;return 0;
}

在这个示例中,我们定义了一个 Point 类,并声明了一个友元函数 distance。这个友元函数可以访问 Point 类的私有成员 xy,从而计算两点之间的距离。 

注意事项:

1、友元关系不是相互的。如果函数A是类B的友元,并不意味着类B是函数A的友元或类B的成员函数可以访问函数A的内部状态。

2、友元关系不能继承。如果基类声明了一个友元函数,派生类不会自动继承这个友元关系。
3、友元可以破坏类的封装性,因此应该谨慎使用。确保只在确实需要时才将函数声明为友元。
4、友元可以是其他类的成员函数,也可以是全局函数或命名空间中的函数。

2.2、 友元类 

(1)什么是友元类?

友元类(Friend Class)是一个被指定为某个类的友元的类,尽管它不是该类的成员,但它可以访问该类的私有成员和保护成员。通过友元类,我们可以在另一个类中访问当前类的私有成员,从而实现更紧密的类之间的协作。

(2)声明友元类

在类的定义中使用 friend 关键字声明友元类。

语法:

class ClassName {friend class FriendClassName;
};

示例:

假设我们有一个 Box 类,表示一个长方体的长、宽和高。我们希望定义一个 BoxUtility 类,该类包含一些用于操作 Box 类的实用函数。为了让 BoxUtility 类访问 Box 类的私有成员,我们可以将 BoxUtility 声明为 Box 的友元类。

#include <iostream>
using namespace std;class Box {
private:double length, width, height;public:Box(double l = 0, double w = 0, double h = 0) : length(l), width(w), height(h) {}// 声明友元类friend class BoxUtility;
};class BoxUtility {
public:static double calculateVolume(const Box &box) {return box.length * box.width * box.height;}static void displayDimensions(const Box &box) {cout << "Length: " << box.length << ", Width: " << box.width << ", Height: " << box.height << endl;}
};int main() {Box box(3.0, 4.0, 5.0);cout << "Volume: " << BoxUtility::calculateVolume(box) << endl;BoxUtility::displayDimensions(box);return 0;
}

在这个示例中,我们定义了一个 Box 类,并声明了一个友元类 BoxUtilityBoxUtility 类包含两个静态函数 calculateVolumedisplayDimensions,它们可以访问 Box 类的私有成员 lengthwidthheight,从而计算体积并显示尺寸。 


以上就是 C++ 程序的友元函数和友元类的基础知识点了。通过友元函数和友元类,我们可以在类的外部访问其私有成员,从而实现更灵活和紧密的类之间的协作。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

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

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

相关文章

一款IM即时通讯聊天系统源码,包含app和后台源码

一款IM即时通讯聊天系统源码 聊天APP 附APP&#xff0c;后端是基于spring boot开发的。 这是一款独立服务器部署的即时通讯解决方案&#xff0c;可以帮助你快速拥有一套自己的移动社交、 企业办公、多功能业务产品。可以 独立部署&#xff01;加密通道&#xff01;牢牢掌握通…

您需要了解的欧盟网络弹性法案

了解CRA包含的内容以及如何遵守。 什么是CRA&#xff1f; 《网络弹性法案》&#xff08;CRA&#xff09;是即将出台的欧盟法规&#xff0c;旨在确保在欧盟销售的所有数字产品和服务&#xff08;如连接到互联网的软件和硬件&#xff09;都采用强大的网络安全措施。 该法案要求…

【数据结构与算法】选择排序篇----详解直接插入排序和哈希排序【图文讲解】

欢迎来到CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;【数据结构与算法】选择排序篇----详解直接插入排序和哈希排序 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux…

Chrome浏览器的Profile数据内容简介

前文简介了Chrome存储的账密/Cookie数据&#xff1a;一段代码读取Chrome存储的所有账号密码和Cookie 本文再扩展介绍一下Chrome存储的其它一些隐私数据。 注&#xff1a;因为业务需要&#xff0c;简单调研了一些基本内容和存储路径&#xff0c;没有深入去研究&#xff0c;有啥…

新160个crackme - 002-abexcm5

运行分析 猜测需要输入正确序列号 PE分析 32位&#xff0c;ASM程序&#xff0c;无壳 静态分析 ida shift F12 &#xff0c;发现字符串定位主函数 分析主函数 lstrcat&#xff1a;拼接字符串 lstrcmpiA&#xff1a;比较字符串 动态调试 serial输入123456调试 发现序列号…

Codeforces Round 957 (Div. 3)(A~D题)

A. Only Pluses 思路: 优先增加最小的数&#xff0c;它们的乘积会是最优,假如只有两个数a和b&#xff0c;b>a&#xff0c;那么a 1&#xff0c;就增加一份b。如果b 1&#xff0c;只能增加1份a。因为 b > a&#xff0c;所以增加小的数是最优的。 代码: #include<bi…

Spring Boot集成groovy快速入门Demo

1.什么是groovy&#xff1f; Groovy 是构建在 JVM 上的一个轻量级却强大的动态语言&#xff0c;它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性。 Groovy 就是用 Java 写的&#xff0c;Groovy 语法与 Java 语法类似&#xff0c;Groovy 代码能够与 Java 代码很好地结合&…

STM32MP135裸机编程:定时器内核时钟频率计算方法

0 工具准备 STM32MP13xx参考手册 1 定时器内核时钟频率计算方法 1.1 定时器分组 STM32MP135的定时器按照时钟源不同分成了三组&#xff0c;如下&#xff1a; APB1: APB2: APB6&#xff1a; 1.2 定时器内核时钟频率计算方法 APB1DIV是APB1的分频系数&#xff0c;APB2DIV、…

python双下划线怎么打

连续按键盘上的“shift_”键两次即可&#xff0c;不同编辑器可能显示会不太一样。像图1中那样没连起来也是对的&#xff0c;没有语法错误。

基于python豆瓣电影爬虫数据可视化分析推荐系统(完整系统源码+数据库+详细文档+论文+详细部署教程)

文章目录 基于python豆瓣电影爬虫数据可视化分析推荐系统&#xff08;完整系统源码数据库详细文档论文详细部署教程&#xff09;一、 选题背景二、研究目的三、开发技术介绍1、Django框架2、LDA3、机器学习推荐算法4、大数据爬虫5、大数据Echarts可视化 四、系统设计思想五、部…

C++ | Leetcode C++题解之第235题二叉搜索树的最近公共祖先

题目&#xff1a; 题解&#xff1a; class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {TreeNode* ancestor root;while (true) {if (p->val < ancestor->val && q->val < ancestor->val) {anc…

贪心算法案例

1.买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔…

代码随想录算法训练营第31天|LeetCode 56. 合并区间、738.单调递增的数字、968.监控二叉树

1. LeetCode 56. 合并区间 题目链接&#xff1a;https://leetcode.cn/problems/merge-intervals/description/ 文章链接&#xff1a;https://programmercarl.com/0056.合并区间.html 视频链接&#xff1a;https://www.bilibili.com/video/BV1wx4y157nD 思路&#xff1a; 本题关…

SpringBoot新手快速入门系列教程十一:自动生成API文档,Springboot3.x集成SpringDoc

本次项目我们用Maven来做&#xff0c;最近发现gradle其实很多项目的支持比较差&#xff0c;所以项目还是用Maven来新建项目。对比了市面上的几种API生成第三方库&#xff0c;只有springdoc 是能够按照文档就能部署出来的。 官网&#xff1a; OpenAPI 3 Library for spring-bo…

链接追踪系列-04.linux服务器docker安装elk

[rootVM-24-17-centos ~]# cat /proc/sys/vm/max_map_count 65530 [rootVM-24-17-centos ~]# sysctl -w vm.max_map_count262144 vm.max_map_count 262144 #先创建出相应目录&#xff1a;/opt/dockerV/es/…docker run -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -d -p 92…

【流媒体】 通过ffmpeg硬解码拉流RTSP并播放

简介 目前RTSP拉流是网络摄像头获取图片数据常用的方法&#xff0c;但通过CPU软解码的方式不仅延时高且十分占用资源&#xff0c;本文提供了一种从网络摄像头RTSP硬解码的拉流的方法&#xff0c;并且提供python代码以便从网络摄像头获取图片进行后续算法处理。 下载ffmpeg F…

2024-07-15 Unity插件 Odin Inspector3 —— Button Attributes

文章目录 1 说明2 Button 特性2.1 Button2.2 ButtonGroup2.3 EnumPaging2.4 EnumToggleButtons2.5 InlineButton2.6 ResponsiveButtonGroup 1 说明 ​ 本章介绍 Odin Inspector 插件中有关 Button 特性的使用方法。 2 Button 特性 2.1 Button 依据方法&#xff0c;在 Inspec…

QT控件篇三

一、微调框 微调框&#xff08;QSpinBox&#xff09;是一个常用的Qt控件&#xff0c;允许用户通过增加或减少值来输入数字。分为两种, 整型-QSpinBox 浮点 QDoubleSpinBoxQSpinBox&#xff08;微调框&#xff09;的 setSingleStep 函数可以用来设置每次调整的步长&#xff08;…

【人工智能】人工智能与传统美工结合,AI美工的详细解析。

AI美工是一个结合了人工智能技术与美工设计的岗位&#xff0c;它利用AI工具和技术来辅助或完成美工设计的各项工作。以下是对AI美工的详细解析&#xff1a; 一、定义与职责 AI美工是指能够熟练使用AI工具和技术&#xff0c;如Midjourney、StableDiffusion等AIGC&#xff08;人…

2024安全行业大模型技术应用态势发展报告

以上是资料简介和目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a;https://t.zsxq.com/dH9bu