C++中的友元(friend)函数和友元类_C++破坏封装性的friend机制


友元函数是定义在类外但能访问其私有和保护成员的普通函数。它通过在类内用friend关键字声明,实现特定函数对类成员的直接访问,如printWidth函数访问Box类的width成员。

c++中的友元(friend)函数和友元类_c++破坏封装性的friend机制

在C++中,友元(friend)机制允许某些函数或类访问另一个类的私有(private)和保护(protected)成员。这种设计初衷是为了在保持封装性的前提下,提供必要的灵活性。然而,由于它打破了类的访问控制限制,很多人认为它破坏了面向对象编程中的封装性

什么是友元函数?

友元函数是定义在类外部的普通函数,但它被授予访问该类私有和保护成员的权限。友元函数不是类的成员函数,也不属于类的作用域,但它必须在类内部用 friend 关键字声明。

例如:

class Box {
private:
    double width;
public:
    Box(double w) : width(w) {}
    friend void printWidth(Box box); // 声明友元函数
};

void printWidth(Box box) {
    std::cout << "Width: " << box.width << std::endl; // 可以访问私有成员
}

这里,printWidth 不是 Box 的成员函数,但因为被声明为友元,可以直接访问 width

什么是友元类?

一个类可以被声明为另一个类的友元类,这意味着该友元类的所有成员函数都可以访问目标类的私有和保护成员。

示例:

class Storage {
private:
    int secret;
    int password;
public:
    Storage(int s, int p) : secret(s), password(p) {}
    friend class DataProcessor; // 声明友元类
};

class DataProcessor {
public:
    void showData(Storage& s) {
        std::cout << "Secret: " << s.secret << ", Password: " << s.password << std::endl;
    }
};

DataProcessor 类可以完全访问 Storage 的私有数据,这在某些协作紧密的类之间可能有用,但也增加了耦合度。

LongShot LongShot

LongShot 是一款 AI 写作助手,可帮助您生成针对搜索引擎优化的内容博客。

LongShot 77 查看详情 LongShot

为什么说友元破坏封装性?

封装的核心思想是隐藏对象的内部实现细节,只通过公共接口与外界交互。而友元机制直接绕过了这一原则:

  • 友元可以自由访问私有成员,相当于开了“后门”
  • 类的设计者无法完全控制谁可以访问其内部数据
  • 一旦大量使用友元,类之间的边界变得模糊,维护难度上升
  • 单元测试和重构变得更加困难,因为修改私有成员可能影响多个友元

从这个角度看,友元确实削弱了封装带来的安全性和模块化优势。

友元的合理使用场景

虽然友元有弊端,但在特定情况下仍有必要使用:

  • 操作符重载:如 operator 需要访问类的私有成员进行输出
  • 工厂模式或管理类:某些专用构建或管理类需要深度访问目标类
  • 性能敏感场景:避免频繁的 getter/setter 调用开销
  • 两个高度耦合的类:逻辑上本应视为一个整体的类对

关键在于:是否真的没有其他替代方案?能否通过公共接口实现相同功能?

基本上就这些。友元是一个强大的工具,但就像指针一样,用得好能提升效率,滥用则会带来混乱。设计时应优先考虑封装,仅在必要时谨慎使用 friend。

以上就是C++中的友元(friend)函数和友元类_C++破坏封装性的friend机制的详细内容,更多请关注其它相关文章!


# 是一个  # 东莞电子网站优化软件  # 网站怎么做社群推广  # 小程序如何对接网站推广  # 短片的推广和营销  # 李俊采seo博客  # 酒吧营销推广方案ppt模板网站  # 东莞抖音seo运营品牌  # 微信精准营销微信推广  # 问答推广营销技巧  # 涞源网络营销推广  # 这一  # c++  # 管理类  # 第三方  # 但它  # 自定义  # 微软  # 重构  # 随机数  # 面向对象  # 封装性  # 作用域  # 面向对象编程 


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


相关推荐: Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程  抖音官网入口快速访问 抖音网页版账号注册解析  Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型  Dagster资产间数据传递与用户配置管理教程  PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】  yy漫画登录页面官方入口_yy漫画在线阅读网址入口  mysql归档数据怎么导出为csv_mysql归档数据导出为csv文件的方法  j*a中ArrayBlockingQueue的使用  行者app怎样导出日志  三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧  第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项  iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法  构建可配置的J*aScript加权点击计数器与共享总计功能  蛙漫2(台版)正版官网 2025免费网页版分享  如何解决Casbin日志与应用日志不统一的问题,使用casbin/psr3-bridge实现无缝集成  Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题  《原神》月之一版本新增书籍一览  以下哪一项是古代兵书三十六计中的计谋  荣耀magicv5怎么上手测评  精通VS Code多光标编辑以实现闪电般快速的修改  J*a实现任务清单管理_集合框架综合入门练手  《红果免费短剧》下载观看方法  使用document.execCommand实现Web文本编辑器加粗/取消加粗  太平年在哪个平台播出  抖音赚钱快速入门_新手必看的抖音赚钱步骤  Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南  Three.js中动态更换3D模型纹理的教程  荣耀盒子应用管理技巧  搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能  英雄联盟争者留名活动介绍  Python高效统计字典嵌套列表值在目标列表中的出现次数  动漫岛在线动漫网 动漫岛动漫在线观看官方入口  Lar*el 关联查询:同时筛选父表与子表数据的高效策略  聚水潭ERP后台管理系统登录 聚水潭ERP官方登录通道  Fedora怎么安装 Fedora Workstation安装步骤  todesk如何添加信任设备_todesk信任设备设置教程  J*a中逻辑运算符如何使用_逻辑与或非的基础用法讲解  ToDesk远程摄像头功能使用方法_ToDesk远程视频画面查看设置教程  MySQL多重JOIN技巧:高效关联同一表获取多角色信息  《地下城堡4:骑士与破碎编年史》墓穴挑战125攻略  铁路12306入口 铁路12306官网版入口登录网址  Win11怎么开启HDR_Windows 11显示器画质增强设置  在Dash应用中自定义HTML标题和网站图标  mysql如何回滚事务_mysql ROLLBACK事务回滚方法  Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧  大熊猫抓取竹子的“大拇指”其实是什么?蚂蚁庄园课堂今天答案最新11月30日  XPath动态元素定位:如何精准选择文本内容变化的元素  铁路12306官网登录入口 铁路12306在线购票官方平台  歌词怎么展示在|直播|间视频号?有什么注意事项?  在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享 

 2025-11-29

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

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

点击免费数据支持

提交您的需求,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.