news 2026/7/31 12:03:18

c++入门——友元

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c++入门——友元

友元

1.引入

在一个类中,我们用private和protected等访问限定符来封装成员,对外暴露接口,对内隐藏细节,但是这也同时增加了一些限制,在类外无法访问类内成员,而友元提供了一种突破类访问限定符封装的方式,可以实现类外访问类内成员,分为友元函数和友元类

2.友元函数

友元函数的实现需要在友元函数前面加上friend,并在需要访问的类中加上友元函数的声明,但这仅仅只是一种声明,并不意味着友元函数是要访问类的成员函数,这个声明可以放在类内的任何位置,不受访问限定符限制,一个函数可以是多个类的友元,在友元函数中可以自由的访问这些类的成员,如下代码所示:

//前置声明 否则A里面友元函数声明里编译器不认识B类型class B;class A{friendvoidfunc(constA&a,constB&b);private:int_a1=1;int_a2=2;};class B{//一个函数可以是多个类的友元friendvoidfunc(constA&a,constB&b);private:int_b1=1;int_b2=2;};voidfunc(constA&a,constB&b){cout<<a._a1<<endl;cout<<b._b1<<endl;}intmain(){A a;B b;func(a,b);return0;}

func()函数需要访问到类A、B中的私有成员变量_a1、_b1,如果不加友元是无法突破访问限定符访问的,此处将友元声明添加在了A和B类内部,使得func()可以访问类A、B的成员
友元函数没有this指针,必须显示传对象的参数

3.友元类

友元类为该类中所有的成员函数提供了一种访问其他类成员的方式,友元类中的成员函数都可以看做是同一个其他类的友元函数,都可以访问另一个类中的成员
友元类的关系是单向的,比如A是B的友元,但是B并不是A的友元
友元类的关系不能传递,比如A是B的友元,B是C的友元,但A不是C的友元

class C{friend class D;//单向关系 D可以访问C,C不能访问Dpublic:voidfun(constD&d);/*{ cout << d._d1 << endl;这里_d1在后面 编译器找不到 }->要声明定义分离*/private:int_c1=3;int_c2=4;};class D{friend class C;//相互成为友元public://如果D里面需要频繁调用C里private 可以声明友元类voidfun(constC&c){cout<<c._c1<<endl;cout<<c._c2<<endl;}private:int_d1;int_d2;};voidC::fun(constD&d){cout<<d._d1<<endl;}intmain(){C c;D d;d.fun(c);return0;}

友元虽然提供了访问的遍历,但是也在一定程度上破坏了耦合度,所以友元不宜多用

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 12:02:29

BetterGI终极指南:如何轻松实现原神全自动化游戏体验 [特殊字符]

BetterGI终极指南&#xff1a;如何轻松实现原神全自动化游戏体验 &#x1f3ae; 【免费下载链接】better-genshin-impact &#x1f4e6;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 |…

作者头像 李华
网站建设 2026/7/31 12:00:55

三步快速获取百度文库纯净PDF:免费下载工具终极指南

三步快速获取百度文库纯净PDF&#xff1a;免费下载工具终极指南 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 还在为百度文库的下载限制而苦恼吗&#xff1f;想要轻松保存那些珍贵的学习资料和工…

作者头像 李华
网站建设 2026/7/31 11:59:53

Box64终极指南:在ARM64设备上运行x86程序的完整教程

Box64终极指南&#xff1a;在ARM64设备上运行x86程序的完整教程 【免费下载链接】box64 Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64, RV64 and LoongArch Linux devices 项目地址: https://gitcode.com/gh_mirrors/bo/box64 Box64是一款…

作者头像 李华
网站建设 2026/7/31 11:59:09

靠谱工厂的AI热成像检测机,如何选对才省心?

在工业自动化与智能制造成熟度不断提升的当下&#xff0c;热成像检测机已从传统红外测温设备&#xff0c;进化为一套融合AI视觉、大数据分析与边缘计算的复合型智能装备。工厂产线对温度敏感点的实时监测、设备诊断及质量管控需求日益精细&#xff0c;如何在众多品牌与型号中选…

作者头像 李华
网站建设 2026/7/31 11:57:59

面向 JVM 特性的云原生之路:Kubernetes 治理 Java 微服务的六大核心机制

随着微服务架构的普及与云原生技术的成熟&#xff0c;Java 应用的部署形态正经历从传统虚拟机托管向容器化编排的深刻变革。然而&#xff0c;Java 技术栈自身的特性——诸如 JVM 启动耗时较长、堆内存管理机制复杂、多环境配置依赖繁重等——使其在容器化落地过程中面临诸多独特…

作者头像 李华
网站建设 2026/7/31 11:54:12

5分钟掌握Form-Generator:Element UI可视化表单设计的终极解决方案

5分钟掌握Form-Generator&#xff1a;Element UI可视化表单设计的终极解决方案 【免费下载链接】form-generator :sparkles:Element UI表单设计及代码生成器 项目地址: https://gitcode.com/gh_mirrors/fo/form-generator Form-Generator是一款基于Element UI的高效可视…

作者头像 李华