C++中的友元函数(friend)有什么用_C++类设计与友元函数应用


友元函数允许非成员函数访问类的私有和保护成员,解决外部函数无法直接操作类内部数据的问题,常用于运算符重载和输入输出操作。

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 成员。

Animate AI Animate AI

Animate AI是个一站式AI动画故事视频生成工具

Animate AI 234 查看详情 Animate AI

友元函数的设计注意事项

虽然友元提供了便利,但也带来一些设计上的权衡:

  • 破坏封装性:友元函数能直接访问私有成员,相当于开了后门,应谨慎使用
  • 仅需必要时才用:只在确实需要跨类操作或重载特定运算符时使用
  • 不影响封装整体性:友元关系不会被继承,也不会传递
  • 可声明在类中的任意位置(一般放在 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优化课程学习  # 泰安营销推广  # 引流推广网站着剖云速捷bd丶  # 英文网站推广免费软件  # 兼职网站网络推广  # 山西正规关键词排名费用  # 木木seo作品  # 秦皇岛网站网站建设  # c++  # 是一种  # 是在  # 是个  # 这一  # 如何实现  # 什么用  # 如何使用  # 多核  # 运算符  # 为什么 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《雷电模拟器》自动点击设置方法  LINUX怎么查看显卡信息_LINUX查看GPU状态  Vue 3中独立响应式实例的创建与应用  《tt语音》超级玩家开通方法  mysql如何配置从库只读_mysql从库只读设置方法  易车网官网直达入口 易车网在线登录入口  抖音评论无法发送如何修复 抖音评论功能操作指南  解决PHP MySQL数据库更新无响应:SQL查询语法错误解析  抖音小程序怎么开通?小程序开通条件是什么?  C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧  鼠标没反应了怎么办 无线/有线鼠标失灵的解决方法【详解】  NumPy 高性能技巧:基于多列条件查找最近邻行索引的向量化实现  PHP动态导航按钮:根据用户登录状态切换链接与文本  微博网页版入口链接 微博网页版在线互动平台  百度识图图像分析 百度识图识别平台  Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧  如何定制PrimeNG Sidebar的背景颜色  批改网官网首页登录 批改网学生用户登录入口  Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  win11如何运行chkdsk命令 Win11检查和修复磁盘逻辑错误教程【修复】  J*a中导出MySQL表为SQL脚本的两种方法  谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程  《via浏览器》强制缩放网页设置方法  冬季去哪个城市旅游更有可能观测到极光  抖音怎么解除第三方绑定_抖音解除第三方平台绑定方法介绍  发布小红书怎么屏蔽粉丝?屏蔽粉丝能看到吗?  mysql怎么查询数据_mysql基础查询语句使用教程  构建可配置的J*aScript加权点击计数器与共享总计功能  Flexbox布局:实现粘性导航与底部页脚的完美结合  管理打开的编辑器:固定、分组和关闭技巧  b站如何剪辑视频_b站必剪app使用教程  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  漫蛙manwa官网浏览入口_漫蛙漫画网页版访问链接  抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?  阿里云共享相册入口在哪  《伊瑟》凶影追缉库卢鲁boss攻略  Apple Music无故扣费引质疑  mysql中外键约束如何使用_mysql FOREIGN KEY操作  J*aScript实现网页表单实时输入字段比较与验证教程  手机远程连接电脑方法  Keras中Convolution2D层及其核心辅助层详解  《漫蛙manwa2》防走失网页版链接2025  解决Pandas DataFrame高度碎片化警告:高效创建多列的策略  tiktok国际版入口_tiktok官网网页版链接  微信网页版在线登录 微信网页版在线使用入口  J*aScript大数运算_BigInt使用指南  使用Google服务账号实现Google Drive API无缝集成与文件访问  鲁班大师乓乓皮肤获取方法  PHP使用DOMDocument与XPath精准追加XML元素教程 

 2025-11-16

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.