MST

星途 面试题库

面试题:C++利用友元类访问非公有成员及应用场景

定义两个类A和B,类A有私有成员变量。使类B成为类A的友元类,让类B的成员函数能够访问类A的私有成员变量。并阐述在实际项目开发中,使用友元类访问非公有成员的合理应用场景以及可能带来的问题。
49.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

class A {
    private:
        int privateVar;
    public:
        A(int value) : privateVar(value) {}
        friend class B;
};

class B {
    public:
        void accessPrivate(A& a) {
            std::cout << "Accessed private variable of A: " << a.privateVar << std::endl;
        }
};

合理应用场景

  1. 辅助类场景:当一个类是另一个类的辅助类,辅助类需要频繁访问主类的私有成员来完成特定功能时。例如,一个Matrix类表示矩阵,有私有成员存储矩阵数据,而MatrixHelper类用于对Matrix进行一些特殊运算,如求逆、转置等,MatrixHelper作为Matrix的友元类,可直接访问Matrix的私有数据成员,这样设计能让辅助类专注于特定功能,同时主类保持数据封装。
  2. 框架与插件场景:在框架开发中,框架类可能有一些私有状态和数据结构,插件类需要访问这些私有内容来扩展框架功能。将插件类设为框架类的友元,能使插件类方便地获取和修改框架类的私有成员,实现定制化的功能扩展。

可能带来的问题

  1. 破坏封装性:友元类打破了类的封装原则,使得类的私有成员可以被其他类直接访问。这可能导致代码的可维护性降低,因为对私有成员的修改可能会影响到友元类,增加了代码修改的风险和复杂度。
  2. 增加耦合度:友元关系使得两个类之间的联系更加紧密,一个类的实现细节暴露给了友元类。这意味着如果其中一个类发生变化,尤其是私有成员的变化,很可能需要同时修改友元类,增加了类之间的耦合度,不利于软件的模块化和可扩展性。