返回

一文读懂 C++ 友元与内部类:揭开“私房话”的神秘面纱

后端

友元概述

友元是一种特殊类型的类或函数,允许访问另一个类或函数的私有成员,从而实现不同类或函数之间的密切合作。友元可以是函数友元或类友元。

函数友元

函数友元是指非成员函数,但它被另一个类的某个成员函数声明为友元,从而允许该友元函数访问这个类的私有成员。

class MyClass {
public:
  // 将函数f()声明为友元
  friend void f();

private:
  int x;
};

// f()是一个友元函数,可以访问MyClass的私有成员
void f() {
  MyClass obj;
  obj.x = 10; // 可以访问私有成员x
}

类友元

类友元是指一个类被另一个类的某个成员函数声明为友元,从而允许该友元类访问这个类的私有成员。

class MyClass {
public:
  // 将类MyOtherClass声明为友元
  friend class MyOtherClass;

private:
  int x;
};

class MyOtherClass {
public:
  void printX(MyClass obj) {
    cout << obj.x; // 可以访问私有成员x
  }
};

内部类概述

内部类是指定义在一个类中的另一个类,作为其私有成员。内部类可以访问外围类的私有成员,而外围类无法访问内部类的私有成员。

class MyClass {
public:
  class InnerClass {
  public:
    void printX() {
      cout << x; // 可以访问外围类的私有成员x
    }
  };

private:
  int x;
};

友元和内部类的优缺点

优点

  • 友元提供了一种突破封装的方式,在一定场景下提供了便利。例如,当需要在不同类之间共享数据时,可以通过友元函数或友元类来实现,而无需暴露类的内部实现细节。
  • 内部类可以访问外围类的私有成员,这在某些情况下非常有用,例如,当需要在内部类中操作外围类的私有数据时。

缺点

  • 友元会增加耦合度,破坏了封装。因为友元可以访问类的私有成员,这可能会导致类的实现细节被其他类所依赖,从而增加了类之间的耦合度,降低了程序的可维护性和扩展性。
  • 内部类也会增加耦合度,并且内部类只能在定义它的类中使用,这限制了它的可重用性。

友元和内部类的应用场景

  • 友元函数常用于辅助类,例如,当需要为一个类提供一个友元函数来操作它的私有成员时,可以使用友元函数。
  • 友元类常用于实现类之间的紧密合作,例如,当需要一个类与另一个类共享数据或功能时,可以使用友元类。
  • 内部类常用于将相关的代码组织在一起,例如,当需要在一个类中定义另一个类来实现某个特定功能时,可以使用内部类。

结论

友元和内部类都是 C++ 中实用的特性,它们可以突破封装的限制,实现不同类或函数之间的密切合作。然而,友元和内部类也会增加耦合度,破坏了封装,因此在使用时需要仔细考虑。