C++ 中的友元(Friend)用法详解

什么是友元(Friend)?👭

友元 (C++) | Microsoft Learn

在C++中,友元(Friend)是一种机制,允许外部函数或类访问某个类的私有(private)或保护(protected)成员

⚠️⚠️友元不是类的成员,但它能绕过封装限制,直接访问类中的私有数据。

2. 友元函数的定义与作用🆙
 

普通成员函数的访问限制

假设有一个类 Person,如下所示:

class Person {
private:std::string name;int age;
public:Person(std::string n, int a) : name(n), age(a) {}
};

在上面的例子中,name age 是私有成员,一般情况下不能从类外直接访问。

 友元函数如何访问私有数据

我们可以定义一个友元函数,允许它直接访问 Person 类的私有成员:

#include <iostream>
using namespace std;
class Person {
private:std::string name;int age;
public:Person(std::string n, int a) : name(n), age(a) {}// 声明友元函数friend void displayPersonInfo(const Person& p);
};// 友元函数的实现
void displayPersonInfo(const Person& p) {std::cout << "Name: " << p.name << ", Age: " << p.age << std::endl;
}int main() {Person p1("Alice", 30);displayPersonInfo(p1); return 0;
}

解释:

  • friend 关键字用于声明 displayPersonInfoPerson 类的友元函数。

  • 虽然 displayPersonInfo 不是 Person 类的成员,但它能访问 nameage

3. 友元类的概念与使用😮‍💨

除了友元函数,C++ 还允许一个类成为另一个类的友元,从而使该类的所有成员函数都能访问另一个类的私有成员。

友元类的示例:

#include <iostream>
using namespace std;
class Engine {
private:int horsepower;
public:Engine(int hp) : horsepower(hp) {}// 声明 Car 为友元类friend class Car;
};class Car {
public:void showEnginePower(const Engine& e) {std::cout << "Engine horsepower: " << e.horsepower << std::endl;}
};int main() {Engine engine(500);Car car;car.showEnginePower(engine);  return 0;
}

解释:

这里,CarEngine 的友元类,因此 Car 的成员函数可以访问 Engine 的私有数据 horsepower

4. 友元的实际案例:为什么以及何时使用?

典型使用场景:

  1. 重载运算符: 需要通过友元函数访问类的私有成员来实现运算符重载

  2. 辅助调试或测试: 有时为了更方便地测试类中的私有数据,可以使用友元。

  3. 跨类协作: 当两个类高度耦合时,可以通过友元类减少重复代码

例子:运算符重载

class Complex {
private:double real, imag;
public:Complex(double r, double i) : real(r), imag(i) {}// 声明友元函数重载 '+' 运算符friend Complex operator+(const Complex& c1, const Complex& c2);
};// 重载 '+' 运算符
Complex operator+(const Complex& c1, const Complex& c2) {return Complex(c1.real + c2.real, c1.imag + c2.imag);
}int main() {Complex c1(1.0, 2.0), c2(3.0, 4.0);Complex c3 = c1 + c2;std::cout << "Real: " << c3.real << ", Imag: " << c3.imag << std::endl;return 0;
}

解释:

  • operator+ 是一个友元函数,用于访问 Complex 类的私有成员 realimag

5. 注意事项⚠️

  1. 破坏封装性: 使用友元会暴露类的私有数据,容易破坏封装性,因此要慎用。

  2. 维护复杂性: 如果过多使用友元类或友元函数,类之间的耦合度会增加,导致代码难以维护。

6. 图解:类与友元的关系

图示:友元函数访问类的私有成员

说明:

图中展示了 Person displayPersonInfo 友元函数的关系。即使 nameage 是私有的,displayPersonInfo 仍然能访问它们。

 复盘吧💪

  • 友元函数友元类允许类的私有成员对外开放,但应谨慎使用。

  • 友元机制非常适用于重载运算符或跨类访问数据的情况,但滥用可能导致代码的耦合性和维护成本增加。

对类访问不是很理解的可以看这篇

C++类域访问方式(public,protected,private)对象访问 , 通过成员函数访问 ,通过友元函数访问-CSDN博客文章浏览阅读144次。C++类的域访问方式主要由访问修饰符控制。了解这些访问方式可以帮助我们设计更安全和可维护的类。通过合理的封装,可以有效保护数据的完整性。https://blog.csdn.net/LJY_CF/article/details/143084393?spm=1001.2014.3001.5502

共勉 💪

同为未来的it人让我们在共同进步吧。

我很喜欢雷军的一段话:我们就悄悄的干,就算失败了咱也不丢人。

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

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

相关文章

IDEA使用Alibaba Cloud Toolkit插件自动化部署jar包

一、下载插件 二、添加服务器主机 三、填写自己服务器配置 四、添加配置 五、配置说明 六、选择maven打包模块 七、maven打包后的jar包位置配一下 八、点击运行发现成功

重学SpringBoot3-Spring WebFlux简介

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-Spring WebFlux简介 1. 什么是 WebFlux&#xff1f;2. WebFlux 与 Spring MVC 的区别3. WebFlux 的用处3.1 非阻塞 I/O 操作3.2 响应式编程模型3.3 更高…

Thread类的介绍

线程是操作系统中的概念&#xff0c;操作系统中的内核实现了线程这种机制&#xff0c;同时&#xff0c;操作系统也提供了一些关于线程的API让程序员来创建和使用线程。 在JAVA中&#xff0c;Thread类就可以被视为是对操作系统中提供一些关于线程的API的的进一步的封装。 多线…

PHP(一)从入门到放弃

参考文献&#xff1a;https://www.php.net/manual/zh/introduction.php PHP 是什么&#xff1f; PHP&#xff08;“PHP: Hypertext Preprocessor”&#xff0c;超文本预处理器的字母缩写&#xff09;是一种被广泛应用的开放源代码的多用途脚本语言&#xff0c;它可嵌入到 HTML…

从新手到高手:Spring AOP的进阶指南

目录 一、AOP简介 1.1 AOP入门案例 1.2 AOP 优点 二、核心概念 2.1 切面(Aspect) 2.2 切点(PointCut) 2.3 通知(Advice) 2.4 织入(Weaving) 三、AOP 原理 3.1 CGLIB 与 JDK动态代理对比 3.2 切面优先级 四、总结 一、AOP简介 AOP(Aspect-Oriented Programming) 面向切面编…

在各大媒体报纸上刊登自己的文章用什么投稿方法发表快?

在职场中,信息宣传是每个单位的重要工作,而每个月的考核投稿任务更是让我深感压力。作为一名普通员工,我常常面临着如何在各大媒体上顺利发表文章的问题。起初,我选择了传统的邮箱投稿方式,然而这条路却让我陷入了无尽的焦虑和挫败之中。 刚开始投稿时,我满怀激情,认真撰写每一…

[论文笔记]HERMES 3 TECHNICAL REPORT

引言 今天带来论文HERMES 3 TECHNICAL REPORT&#xff0c;这篇论文提出了一个强大的工具调用模型&#xff0c;包含了训练方案介绍。同时提出了一个函数调用标准。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 聊天模…

数据库事务

为了保证一致性 1.ACID 事务具有四个基本特性&#xff0c;也就是通常所说的 ACID 特性&#xff0c;即原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#x…

算法: 模拟题目练习

文章目录 模拟替换所有的问号提莫攻击Z 字形变换外观数列数青蛙 总结 模拟 替换所有的问号 按照题目的要求写代码即可~ public String modifyString(String ss) {int n ss.length();if (n 1) {return "a";}char[] s ss.toCharArray();for (int i 0; i < n; i…

使用Python和Proxy302代理IP高效采集Bing图片

目录 项目背景一、项目准备环境配置 二、爬虫设计与实现爬虫设计思路目标网站分析数据获取流程 代码实现1. 初始化爬虫类&#xff08;BingImageSpider&#xff09;2. 创建存储文件夹3. 获取图像链接4. 下载图片5. 使用Proxy302代理IP6. 主运行函数 运行截图 三、总结 项目背景 …

SpringMVC一个拦截器和文件上传下载的完整程序代码示例以及IDEA2024部署报错 找不到此 Web 模块的 out\artifacts\..问题

一、SpringMVC一个拦截器和文件上传下载的完整程序代码示例 本文章是一个 SpringMVC拦 截器和文件上传下载的完整程序代码示例&#xff0c;使用的开发工具是 IntelliJ IDEA 2024.1.6 (Ultimate Edition)&#xff0c; 开发环境是 OpenJDK-21 java version 21.0.2。Tomcatt版本为…

【C++篇】类与对象的秘密(上)

目录 引言 一、类的定义 1.1类定义的基本格式 1.2 成员命名规范 1.3 class与struct的区别 1.4 访问限定符 1.5 类的作用域 二、实例化 2.1 类的实例化 2.2 对象的大小与内存对齐 三、this 指针 3.1 this指针的基本用法 3.2 为什么需要this指针&#xff1f; 3.3 t…

基于SSM+微信小程序的房屋租赁管理系统(房屋2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的房屋租赁管理系统实现了有管理员、中介和用户。 1、管理员功能有&#xff0c;个人中心&#xff0c;用户管理&#xff0c;中介管理&#xff0c;房屋信息管理&#xff…

Java基础-IO基础

IO是指input/output&#xff0c;即输入和输出。输入和输出是以内存为中心的&#xff1a; input 从外部往内存输入数据&#xff0c;比如硬盘中的数据写入内存等。 output 从内存往外输出数据&#xff0c;比如内存数据写入硬盘等。 File File类表示一个文件或者一个目录。使用F…

【服务器虚拟化是什么?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

父子元素中只有子元素设置margin-bottom的问题

问题代码如下所示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>.div1 {background-color: red;width: 80px;height: 80px;border: 1px solid orange;}.div2 {bac…

【飞腾加固服务器】全国产化解决方案:飞腾FT2000+/64核,赋能关键任务保驾护航

在信息安全和自主可控的时代背景下&#xff0c;国产化设备的需求与日俱增&#xff0c;尤其是在国防、航空航天、能源和其他关键行业。高可靠性和极端环境设计的国产加固服务器&#xff0c;搭载强大的飞腾FT2000/64核处理器&#xff0c;全面满足国产自主可控的严苛要求。 性能强…

光伏电站设计之辐照度效果(threejs实现)

类似 solaredge里面的日照度效果 1、由经纬度和屋顶朝向获取&#xff08;参考pvlib&#xff09;当前地区的辐照度值&#xff0c; 2、根据辐照度值插值获取对应辐照度的颜色。 3、计算片段着色器里面计算每个顶点的遮挡率和紫色混合 4、计算鼠标移动中的投射屋顶位置辐照度&…

Ansible自动化运维管理工具

一、Ansible 1.1、自动化运维管理工具有哪些&#xff1f; 工具架构语言使用情况Ansible无clientpython 协议用ssh95%puppetC/Sruby 协议用http基本不用chefC/Sruby 协议用http基本不用saltstackC/Spython 协议用ssh5% 1.2、Ansible简介 Ansible是一个基于Py…

网易翻译工具解析!这几大翻译器值得一试!

翻译工具的出现&#xff0c;使得跨语言沟通变得更加便捷。本文将为您推荐几款优秀的翻译工具&#xff0c;包括福昕在线翻译、福昕翻译客户端、海鲸AI翻译和网易有道翻译&#xff0c;帮助您在学习、工作和生活中轻松应对语言挑战。 福昕在线翻译 直达链接&#xff08;复制到浏…