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


相关推荐: 冬季去寒冷地区旅游,以下哪种做法有助于缓解冻伤  LocoySpider如何批量采集电商商品_LocoySpider电商采集的模板应用  创建您的便携版VS Code:让配置随身携带  Google Drive API服务器端访问指南:服务账户认证详解  Go语言中方法接收器的选择:值类型还是指针类型?  tiktok国际版入口_tiktok官网网页版链接  智学网app怎么登录忘记密码_智学网app忘记密码找回与重新登录操作方法  实现可重用自定义Python Range类  广州地铁app准妈咪徽章领取方法  DeepSeek超全面指南:入门必看  QQ网页版官方账号登录入口 QQ网页版网页版入口快速导航  京东物流快递破损了怎么办_京东快递破损理赔流程  解决 Vue 3 组件未定义错误:理解 createApp 与根组件的正确使用  如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色  Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题  iPhone14无法连接蓝牙设备如何解决  优化长HTML属性值:SonarQube警告与实用策略  国际经济与贸易就业方向解析  《优志愿》修改手机号方法  《书耽》更换手机号方法  菜鸟驿站的取件码忘了怎么办 手机快速查询指南  红手指专业版app注册教程  厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项  192.168.1.1路由器后台入口 192.168.1.1默认登录入口  J*a中导出MySQL表为SQL脚本的两种方法  win11关机几秒又自己开机 Win11关机自动重启问题修复  苹果手机手电筒无法开启  sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程  t3出行如何使用微信支付  VBA Outlook邮件自动化:高效集成Excel数据与列标题的策略  哔哩哔哩黑名单怎么查看  QQ邮箱PC端登录页面_QQ邮箱网页版登录界面  德邦物流在线查询系统 德邦快递货物运输追踪  Teambition网盘如何共享文件  《淘宝联盟》推广自己的店铺方法  使用VS Code调试Python代码:从入门到精通  全球各国上班时间表外贸邮件时间  《爱南宁》认证电动车方法  SQL聚合查询、联接与筛选:GROUP BY 子句的正确使用与常见陷阱  Python测试中模块导入路径解析的最佳实践  Fedora怎么安装 Fedora Workstation安装步骤  J*aScript 数值去小数位处理:多种方法与实践  优酷官网登录入口电脑版 优酷官网网址入口  解决Flex容器横向滚动内容截断与偏移问题  天堂漫画网页版在线阅读 天堂漫画手机版入口  外媒评《燕云十六声》DIY载具新玩法:很像《塞尔达传说王国之泪》!  菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤  《微信》视频号原创声明开启方法  优化 WooCommerce 产品价格显示与自定义短代码集成  家里的小飞虫总是不断,用什么方法可以彻底根除? 

 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.