1.87、解释什么是友元类(friend class)或友元函数(friend function)

友元类(friend class)和友元函数(friend function)是C++中用于突破类的访问控制限制的一种机制,允许非成员函数或其他类访问该类的私有(private)和保护(protected)成员。


友元函数(friend function)

  • • 定义:友元函数不是类的成员函数,但被类声明为友元后,拥有访问该类所有成员(包括private和protected)的权限。
  • • 声明方式:在类内部使用friend关键字声明该函数。
  • • 用途:常用于实现需要访问类内部状态但不适合成为成员函数的操作,比如重载某些运算符、辅助函数等。
  • • 特点
    • • 不是类的成员函数,没有this指针。
    • • 可以访问类的所有成员。
    • • 可以是普通函数、函数模板、类的成员函数等。
    • • 需要在类定义中声明,但函数体一般定义在类外。
  • • 示例
class A {
private:
    int x;
public:
    A(int val) : x(val) {}
    friend void showX(const A& a);  // 友元函数声明
};

void showX(const A& a) {
    std::cout << "x = " << a.x << std::endl;  // 访问私有成员
}

友元类(friend class)

  • • 定义:当一个类被另一个类声明为友元类时,友元类的所有成员函数都可以访问该类的私有和保护成员。
  • • 声明方式:在类内部使用friend class 类名;声明。
  • • 用途:适用于两个类之间关系非常紧密,需要互相访问内部实现细节的场景,比如设计辅助类、管理类等。
  • • 特点
    • • 友元关系是单向的,被友元类可以访问声明它为友元的类的私有成员,但反之不成立。
    • • 友元关系不具有继承性和传递性。
  • • 示例
class B;  // 前向声明

class A {
private:
    int data;
public:
    A() : data(42) {}
    friend class B;  // 声明B为友元类
};

class B {
public:
    void showData(const A& a) {
        std::cout << "A::data = " << a.data << std::endl;  // 访问A的私有成员
    }
};

面试考察重点

  • • 理解友元不是成员,但享有访问权限,打破封装的“例外”机制。
  • • 友元关系的单向性,即友元类/函数可以访问被友元类的私有成员,但反过来不成立。
  • • 友元关系的非继承性和非传递性,即友元不会自动传递给派生类或其他类。
  • • 合理使用友元的设计原则,避免过度破坏封装,保持代码模块性和维护性。
  • • 区别友元函数和成员函数的访问权限和调用方式
  • • 熟悉友元函数定义可以放在类内或类外,但友元函数本质是非成员函数
    本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
    (加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
THE END