

新闻资讯
技术学院友元类是为解决特定协作场景下深度交互与封装保护的矛盾而设,如容器与迭代器、类簇构造、单元测试等,需克制使用且明确声明。
友元类不是为了“打破封装”,而是为了解决特定协作场景
下,类与类之间需要深度交互但又不便暴露公有接口的矛盾。它的使用应当克制、明确且有充分理由。
当两个类在逻辑上构成一个整体,比如容器类和它的迭代器类,迭代器必须能直接访问容器的底层指针或节点结构,但把所有成员设为 public 会破坏容器的数据完整性约束。此时将迭代器声明为容器的友元类,既保证了访问效率,又维持了封装边界——只有迭代器能越界访问,其他外部代码依然被隔离。
某些设计中,对外只暴露一个抽象接口类,而实际由多个具体实现类分工协作(如不同压缩格式的解码器)。主接口类可能需要创建并初始化这些实现类,并直接设置其私有状态(如缓冲区地址、解码上下文),但又不希望把这些初始化逻辑暴露为 public 接口。这时可将主接口类声明为各实现类的友元。
测试代码本身不属于产品模块,但需要检查类的私有成员是否按预期更新(例如缓存命中计数、状态机当前 stage)。将测试类(如 TestMyClass)声明为被测类的友元,可在测试中直接断言私有变量值,而不必为测试破环设计——无需添加仅供测试用的 public getter。
基本上就这些。友元类不是语法糖,而是协作契约——它让两个类在编译期就约定好“我信你,只信你”。用对了,代码更清晰;滥用,则封装形同虚设。