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

友元类能访问哪些成员?
友元类可以访问被声明为 friend 的类的 所有非静态成员,包括 private 和 protected 成员,但不能直接访问静态私有成员(需通过作用域解析或对象调用,权限本身是允许的)。这种访问权仅限于该友元类的成员函数内部,不传递、不继承、不自动授予其派生类。
友元关系是否可继承或传递?
不可以。友元关系既不继承,也不传递:
-
class A声明class B为友元 →B可访问A的私有成员 -
class C : public B→C仍 不能 访问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. 公共接口:什么时候该用?
友元类适合极少数强耦合场景,比如:
立即学习“C++免费学习笔记(深入)”;
- 容器类与其迭代器类(如
std::vector和它的iterator) - 配套的工厂/管理类需要深度操作目标类内部状态(如内存池管理器与缓冲区类)
- 单元测试类(部分框架中显式声明为友元以验证私有逻辑)
但要注意:它破坏封装性,一旦滥用会显著提高维护成本。比起友元,优先考虑 public / protected 接口、getter/setter 或 const 成员函数暴露必要能力。










