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

【C++】类和对象--友元机制

目录

    • 友元函数
    • 友元类

封装性要求私有成员对外隐藏,但有时又需要给予特定外部函数或类访问特权。C++用friend关键字提供了一种有控制的封装突破方式——友元。

友元函数

在类内部使用friend关键字声明的外部函数,称为该类的友元函数。它的特征如下:

  • 不是类的成员函数,但是可以访问类的私有和保护成员。
  • 没有this指针,不能使用const修饰(const修饰成员函数本质是修饰this)。
  • 可以在类内部的任何位置声明(不受访问限定符影响)。

一个典型的应用场景是重载流插入operator<<和流提取operator>>。因为这两个运算符的左操作数是ostreamistream,若重载为成员函数,左操作数只能是本类对象,就必须写成d << cout,不符合习惯。因此将它们重载为全局函数,并在类中声明为友元以访问私有成员。

classDate{friendostream&operator<<(ostream&out,constDate&d);friendistream&operator>>(istream&in,Date&d);public:Date(intyear=1900,intmonth=1,intday=1):_year(year),_month(month),_day(day){}private:int_year,_month,_day;};ostream&operator<<(ostream&out,constDate&d){out<<d._year<<"年"<<d._month<<"月"<<d._day<<"日";returnout;}istream&operator>>(istream&in,Date&d){in>>d._year>>d._month>>d._day;returnin;}

使用友元时需谨慎,它增加了类与外界的耦合。只在确实需要直接访问私有成员时使用,例如运算符重载、紧密相关的辅助功能等。

友元类

一个类可以将另一个类声明为自己的友元类,此时友元类的所有成员函数都可以访问该类的私有和保护成员。

classTime{friendclassDate;// Date 可以访问 Time 的私有成员public:Time(inthour=0,intminute=0,intsecond=0):_hour(hour),_minute(minute),_second(second){}private:int_hour,_minute,_second;};classDate{public:Date(intyear=1,intmonth=1,intday=1){_t._hour++;// 直接访问 Time 的私有成员}voidSetTimeOfDate(inthour,intminute,intsecond){_t._hour=hour;_t._minute=minute;_t._second=second;}private:int_year,_month,_day;Time _t;};

友元关系的几个特点:

  • 单向性:上述例子中,Date可以访问Time的私有成员,反之不行。
  • 不可传递:若A是B的友元,B是C的友元,A并不是C的友元。
  • 不可继承:友元关系不会被子类继承。

友元打破了封装,应该“少而精”。在需要高内聚但又有少量外部需要深度协作的场景下,它是最佳选择。

http://www.jsqmd.com/news/1191327/

相关文章:

  • 腾讯混元Hy3 MoE架构解析:2小时开发完整APP的Agent编程实战
  • 汽车电源设计实战:LM51501-Q1升压控制器在启停与紧急呼叫系统中的应用
  • 4G模块AT指令实战:从Text到PDU模式发送中文短信的避坑指南
  • 抖大侠与抖店是什么关系_第三方服务身份说明 - 抖大侠
  • 实时双语字幕系统底层原理与工程实践
  • Claude Code 模板:AI 开发的认知卸载与金融工程实践
  • 【51单片机】点阵LED的创意表白:从跳动爱心到滚动字母
  • Python基础语法速成:100分钟掌握核心编程概念与实战应用
  • Apple登录后端验证:从JWT解析到公钥缓存的实战优化
  • 交通事故技术取证与责任认定:视频分析与证据链构建实践
  • UABEA:Unity资源包分析与编辑的跨平台利器
  • TRAE SOLO:面向独立开发者的三端联动智能协作操作系统
  • 竹席点钻机机架刚性分析与胶量控制精度实测
  • 40克AI眼镜如何实现无感实时翻译?唇动识别+骨导+单色显示三重突破
  • (2026最新)德阳漏水检测维修师傅上门-正规防水补漏公司本地居民实测推荐五家-卫生间/屋顶/厨房/阳台/外墙/地下室专业仪器精准检测漏水点 - 安佳防水
  • AI智能体如何通过具身化在特定环境中实现价值
  • OpenCV基准标记AR追踪:从原理到实战,实现稳定增强现实
  • 2026年黄金首饰回收实力企业如何选实用避坑全指南 - 热点品牌推荐
  • AI大模型在政务服务的边界:能做什么,不能做什么?
  • 对象创建模式详解:工厂方法与建造者模式在Java开发中的应用
  • FPD-Link III解串器DS90UB662-Q1:多路视频同步与CSI-2协议实战解析
  • 三维空间平面交线计算:从数学原理到C++健壮实现
  • 从零到一:超外差收音机焊接全流程实战与高频电路解析
  • C函数函数
  • 2026年江西吉安地区精油生产厂家怎么选不踩坑 - 热点品牌推荐
  • OpenCV模板匹配技术实战:游戏画面识别与自动化触发
  • 用SciPy做业务假设检验:从p值到决策的完整实践
  • 功率管死区时间测量与优化:从原理到实践完整指南
  • AI图像生成提示词工程:从创意描述到视觉实现的技术解析
  • SystemC:Channel