C++类中的友元类(Friend Class)有什么权限?(访问另一个类的私有成员)

发布时间 - 2026-01-09 00:00:00    点击率:
友元类能访问被声明为friend的类的所有非静态成员(含private和protected),但不能直接访问静态私有成员;友元关系不可继承、不传递;使用时需通过对象实例访问,避免语法或作用域错误。

友元类能访问哪些成员?

友元类可以访问被声明为 friend 的类的 所有非静态成员,包括 privateprotected 成员,但不能直接访问静态私有成员(需通过作用域解析或对象调用,权限本身是允许的)。这种访问权仅限于该友元类的成员函数内部,不传递、不继承、不自动授予其派生类。

友元关系是否可继承或传递?

不可以。友元关系既不继承,也不传递:

  • class A 声明 class B 为友元 → B 可访问 A 的私有成员
  • class C : public BC不能 访问 A 的私有成员
  • B 中的友元函数或类,不会自动让 A 对它们开放权限

常见误用:在友元类中访问私有成员时出错

典型错误不是权限缺失,而是语法或作用域问题:

  • 忘记通过对象实例访问(如写 A::private_member 而非 a_obj.private_member
  • 试图在友元类的 static 成员函数中直接访问非静态私有成员(必须通过具体对象)
  • 在模板类中声明友元时未正确处理模板参数(如漏写 template 或未用 friend class B;
class A {
    int x = 42;
    friend class B;  // 正确:B 是 A 的友元
};

class B {
public:
    void f(A& a) {
        a.x = 100;  // ✅ 合法:通过 A 的对象访问私有成员
    }
    static void g(A& a) {
        a.x = 200;  // ✅ 同样合法:静态函数仍可通过对象访问
    }
};

友元类 vs. 公共接口:什么时候该用?

友元类适合极少数强耦合场景,比如:

  • 容器类与其迭代器类(如 std::vector 和它的 iterator
  • 配套的工厂/管理类需要深度操作目标类内部状态(如内存池管理器与缓冲区类)
  • 单元测试类(部分框架中显式声明为友元以验证私有逻辑)

但要注意:它破坏封装性,一旦滥用会显著提高维护成本。比起友元,优先考虑 public / protected 接口、getter/setterconst 成员函数暴露必要能力。

友元类的权限边界很清晰,但「能做」不等于「该做」——真正容易被忽略的是:它让两个类的实现细节彼此绑定,后续只要其中一个类的私有布局变动,另一个类就可能悄无声息地编译失败或行为异常。


# c++  # 作用域  # 封装性  # Static  # 封装  # 成员函数  # const  # 继承  # 接口  # class  # public  # private  # protected  # 对象  # 类中  # 的是  # 也不  # 什么时候  # 不可以  # 管理器  # 其中一个  # 能做  # 而非  # 悄无声息 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Android使用GridView实现日历的简单功能  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  如何快速搭建高效服务器建站系统?  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  魔毅自助建站系统:模板定制与SEO优化一键生成指南  原生JS实现图片轮播切换效果  js实现点击每个li节点,都弹出其文本值及修改  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Laravel如何集成Inertia.js与Vue/React?(安装配置)  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Laravel如何使用Collections进行数据处理?(实用方法示例)  创业网站制作流程,创业网站可靠吗?  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  如何在腾讯云免费申请建站?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何在阿里云部署织梦网站?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  中国移动官方网站首页入口 中国移动官网网页登录  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  iOS验证手机号的正则表达式  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  如何基于云服务器快速搭建网站及云盘系统?  中山网站制作网页,中山新生登记系统登记流程?  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  微信小程序 require机制详解及实例代码  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何用狗爹虚拟主机快速搭建网站?  bootstrap日历插件datetimepicker使用方法  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  Python面向对象测试方法_mock解析【教程】  Laravel模型事件有哪些_Laravel Model Event生命周期详解