新闻中心
C++中的友元函数(friend)有什么用_C++类设计与友元函数应用
友元函数允许非成员函数访问类的私有和保护成员,解决外部函数无法直接操作类内部数据的问题,常用于运算符重载和输入输出操作。

在C++中,友元函数(friend function)是一种特殊的机制,允许非成员函数访问类的私有(private)和保护(protected)成员。正常情况下,类的私有成员只能被该类的成员函数访问,外部函数或其它类无法直接读取或修改它们。而通过将某个函数声明为类的友元,就可以打破这一限制。
为什么需要友元函数?
有时候,我们需要让某个独立的函数操作类的内部数据,但又不希望把这个函数作为类的成员函数。比如重载运算符、输入输出操作等场景:
- 实现 operator 输出类对象时,左操作数是 std::ostream&,不能定义为成员函数(否则this指针会占用第一个参数)
- 两个不同类之间需要共享内部实现细节进行协作
- 某些工具函数需要高效访问多个类的私有数据
这时,友元函数就派上用场了。
如何使用友元函数?
在类定义中使用 friend 关键字声明一个函数,即可将其设为友元。这个函数可以是全局函数,也可以是另一个类的成员函数。
// 示例:重载输出运算符class Point {
private:
int x, y;
public:
Point(int x = 0, int y = 0) : x(x), y(y) {}
friend std::ostream& operatorconst Point& p);
};
std::ostream& operatorconst Point& p) {
os return os;
}
这里,operator 不是 Point 的成员函数,但由于被声明为友元,它可以访问 x 和 y 成员。
Zyro AI Background Remover
Zyro推出的AI图片背景移除工具
145
查看详情
友元函数的设计注意事项
虽然友元提供了便利,但也带来一些设计上的权衡:
- 破坏封装性:友元函数能直接访问私有成员,相当于开了后门,应谨慎使用
- 仅需必要时才用:只在确实需要跨类操作或重载特定运算符时使用
- 不影响封装整体性:友元关系不会被继承,也不会传递
- 可声明在类中的任意位置(一般放在 public 或 private 均可,不影响其权限)
例如,在实现两个类相互操作时:
class B; // 提前声明class A {
private:
int dataA = 100;
public:
friend void exchange(A& a, B& b); // 友元函数可访问A和B的私有成员
};
class B {
private:
int dataB = 200;
public:
friend void exchange(A& a, B& b);
};
void exchange(A& a, B& b) {
int
tmp = a.dataA;a.dataA = b.dataB;
b.dataB = tmp;
}
这种写法避免了暴露私有成员,同时实现了跨类数据交换。
基本上就这些。友元函数是C++中一个实用但需节制使用的特性,合理应用能提升接口设计的灵活性,尤其是在运算符重载和类间协作场景中表现突出。关键是要清楚它不是“打破封装”的借口,而是封装的一种补充手段。不复杂但容易忽略。
以上就是C++中的友元函数(friend)有什么用_C++类设计与友元函数应用的详细内容,更多请关注其它相关文章!
# 多个
# 小众网站seo分析
# 网站建设前后期的优化
# 新乐市网站优化
# 易县网站推广培训
# 广西网站优化效果
# 百度seo在中国
# sem是什么和seo
# 免费seo在哪看
# 公司网站建设内容
# 百度的关键词排名怎么做
# c++
# 第一个
# 放在
# 是一种
# 是在
# 这一
# 正确处理
# 如何处理
# 什么用
# 运算符
# 为什么
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
动漫花园资源网使用步骤_动漫花园资源网下载流程
汽水音乐在线解析 汽水音乐在线解析入口
小米14应用无法联网原因分析_小米14网络权限修复
利用Bokeh CustomJS动态控制DataTable列可见性
J*a里如何使用forEach遍历Map_Map遍历方法说明
Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性
如何在网页中实现特定地点的随机图片展示
excel如何生成目录 excel一键生成工作表目录超链接
UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技
深入理解J*aScript Promise异步执行与微任务队列
漫蛙漫画网页端入口 漫蛙2官方正版漫画站点
J*aScriptWebpack优化_J*aScript构建工具实战
台积电1.4nm工艺A14瞄准2028:10年来性能提升80%
Typer应用中灵活处理命令行参数的令牌化与解析
《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元
msn官网入口地址手机版 msn官方网站手机最新链接
蛙漫画网页版全站入口 蛙漫热门作品免费浏览
谷歌推RCS信息存档功能:公司可监控员工私密信息!
J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南
在Runstone环境中高效处理TasteDive API的JSON数据
C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页
必由学在线入口 必由学网页版快速登录入口
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
如何在Promise链中有效终止错误处理后的执行
Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】
cad如何更改注释性对象的比例_cad注释性比例调整方法
蛙漫2台版漫画地址 Manwa2正版网页版链接
KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明
sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置
如何使用Go和Martini动态服务解码后的图片
Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值
深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现
J*aScript 字符串标签转换:使用正则表达式高效替换
解决J*aScript中重复选择项的确认对话框显示问题
html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构
钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧
包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址
1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】
怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】
Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法
Python大型XML文件高效流式解析教程
使用Pandas转换并合并DataFrame:多列映射至统一结构
黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】
Lar*el Form Request中唯一性验证在更新操作中的正确实现
向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程


2025-11-16
浏览次数:次
返回列表