信息发布→ 登录 注册 退出

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

发布时间:2026-01-09

点击量:
友元类能访问被声明为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 成员函数暴露必要能力。

友元类的权限边界很清晰,但「能做」不等于「该做」——真正容易被忽略的是:它让两个类的实现细节彼此绑定,后续只要其中一个类的私有布局变动,另一个类就可能悄无声息地编译失败或行为异常。
标签:# protected  # 悄无声息  # 而非  # 能做  # 其中一个  # 管理器  # 不可以  # 什么时候  # 也不  # 的是  # 类中  # 对象  # c++  # private  # public  # class  # 接口  # 继承  # const  # 成员函数  # 封装  # Static  # 封装性  # 作用域  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!