当前位置: 首页 > news >正文

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;}

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

http://www.cnnetsun.cn/news/3765776.html

相关文章:

  • BetterGI终极指南:如何轻松实现原神全自动化游戏体验 [特殊字符]
  • 三步快速获取百度文库纯净PDF:免费下载工具终极指南
  • Box64终极指南:在ARM64设备上运行x86程序的完整教程
  • 靠谱工厂的AI热成像检测机,如何选对才省心?
  • 面向 JVM 特性的云原生之路:Kubernetes 治理 Java 微服务的六大核心机制
  • 5分钟掌握Form-Generator:Element UI可视化表单设计的终极解决方案
  • kubeadm 离线部署全流程-20260730
  • Vben Admin 5.0技术栈解析与中后台开发实战
  • 《无畏契约》深度解析:从射击机制到战术博弈的竞技游戏设计
  • STM32F103驱动TMC2209步进电机:UART配置与静音控制实战
  • AI视频抠像失效的7个隐性元凶(附实测对比数据集与逐帧调试SOP)
  • 供应链防线深度实践:GitHub Actions 的执行前拦截来了,Agent CI/CD 还要补哪三道门
  • 微信小程序开发框架与工具链选型实战:Taro vs uni-app深度解析
  • 语言模型如何革新复杂系统优化求解
  • AI视频无缝衔接完全指南
  • VMWare Player安装Red Hat Linux:免费虚拟机环境搭建与优化指南
  • 双缸剪刀片生产厂家最新选购指南一览
  • 5分钟掌握终极压缩神器:免费开源的视频图片批量压缩工具
  • 抖音批量下载神器完整指南:5分钟掌握高效内容管理
  • Cocos Creator VR开发环境配置全攻略:从原理到实践
  • DLSS Swapper完全指南:像换轮胎一样轻松更换游戏DLSS版本
  • Python基础数据类型详解:从整数到复数
  • 从零开始:如何用Rhino.Inside.Revit免费打通BIM与参数化设计壁垒
  • DLSS Swapper完全指南:轻松管理游戏DLSS版本提升性能体验
  • iNeuOS_AiInsight·数智灵鉴(Text2SQL/NL2SQL自然语言大模型智能问数),免费下载试用
  • 如何在PC上畅玩Switch游戏:yuzu模拟器完整指南
  • DX诺克斯驱动器评测:三种形态切换的假面骑士玩具体验
  • AI辅助学术写作:论文引言生成技术解析
  • 嘎嘎降AI论文处理工具全流程使用指南
  • 信息系统项目管理师教程(第4版)笔记——第 21 章 项目管理科学基础