MST

星途 面试题库

面试题:C++ 中友元机制在对象间数据共享的应用及利弊

说明友元类和友元函数在 C++ 里怎样用于对象间的数据共享。分析这种数据共享方式的优点与潜在弊端,同时编写一段代码展示友元函数对类私有成员的访问实现数据共享。
39.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

友元类和友元函数在C++中用于对象间数据共享的方式

  1. 友元函数:在一个类中,可以将其他函数(可以是全局函数或其他类的成员函数)声明为友元函数。友元函数能够访问该类的私有和保护成员。这使得在不破坏类的封装性原则下,让特定的函数具有访问类内部数据的权限,实现对象间的数据共享。
  2. 友元类:一个类可以声明另一个类为它的友元类。当一个类A是类B的友元类时,类A的所有成员函数都可以访问类B的私有和保护成员。这样类A和类B之间就可以方便地共享数据。

优点

  1. 增强灵活性:允许特定的函数或类访问私有成员,在某些情况下能够方便地实现一些复杂的功能,比如对类内部数据进行特殊的操作,而不需要通过类本身的公有接口。
  2. 提高效率:避免了通过公有接口间接访问私有成员带来的额外开销,直接操作数据可以提高程序的执行效率。

潜在弊端

  1. 破坏封装性:友元机制在一定程度上破坏了类的封装性,因为它使得外部函数或类可以直接访问类的私有成员,这可能导致数据的不一致性或意外修改。
  2. 可维护性降低:过多使用友元可能使得代码的依赖关系变得复杂,增加了代码维护的难度,因为其他部分代码对类的私有成员有直接访问,修改类的私有成员可能影响到多个友元函数或类。

代码示例

#include <iostream>

class ClassB; // 前向声明

class ClassA {
private:
    int privateData;
public:
    ClassA(int data) : privateData(data) {}
    // 声明ClassB的成员函数为友元函数
    friend void ClassB::accessPrivateData(ClassA& a);
};

class ClassB {
public:
    void accessPrivateData(ClassA& a) {
        std::cout << "Accessing private data of ClassA: " << a.privateData << std::endl;
    }
};

int main() {
    ClassA a(10);
    ClassB b;
    b.accessPrivateData(a);
    return 0;
}

在上述代码中,ClassB的成员函数accessPrivateData被声明为ClassA的友元函数,这样accessPrivateData函数就可以访问ClassA的私有成员privateData,实现了数据共享。