您的位置:

友元类:让外部类访问私有成员

一、什么是友元类

在C++中,如果一个类需要访问另一个类的私有成员,通常情况下是不允许的。但是,在一些特殊情况下,我们可能需要允许外部类或者函数访问私有成员,这就需要使用友元(friend)。

友元类(friend class)指的是能够访问当前类私有成员的另一个类。

一个类可以将另一个类声明为友元类,从而允许该类访问自己的私有成员。友元类的意义在于增加了程序的灵活性和可读性,但同时也破坏了封装性。

二、如何使用友元类

在C++中,可以通过在类定义中使用friend关键字来声明友元类。

  class A {
    friend class B;
    private:
      int a;
  };
  class B {
    public:
      void func(A& obj) {
        obj.a = 10; //B类可以访问A类的私有变量a
      }
  };

在上面的例子中,类A将类B声明为友元类,允许类B访问A类的私有成员a。在类B中的成员函数func中,就可以访问A类的私有成员a了。

三、友元类的优缺点

优点:

1. 增加程序的灵活性。友元类可以访问当前类的私有成员,可以在类定义中根据需要声明多个友元类,从而增加程序的灵活性。

2. 可以提高程序的效率。通过使用友元类,可以减少函数的参数传递,从而提高程序的效率。

缺点:

1. 破坏了封装性。友元类能够访问当前类的私有成员,破坏了封装性,使程序的可读性降低。

2. 可能导致程序的安全性降低。友元类能够访问当前类的私有成员,如果不加限制地使用友元类,可能会导致程序的安全性降低。

四、友元类的使用场景

如前所述,友元类的使用通常会破坏类的封装性,因此应该尽量避免使用。但在一些特殊情况下,使用友元类是比较合适的,例如:

1. 在构建大型软件框架时,可能需要允许不同的类之间进行通信,此时使用友元类可以使通信更为方便。

2. 在某些算法或模板类中,需要访问其他类的私有成员,此时使用友元类可以使算法或模板类编写更加简单。

总之,友元类应该谨慎使用,只有在确实有必要时才应该使用。

五、总结

友元类是一种特殊的类,它能够访问当前类的私有成员。通过使用友元类,可以增加程序的灵活性和效率,但也会破坏类的封装性,可能会导致程序的安全性降低。在实际应用中,应该根据具体情况谨慎使用。

六、代码示例

#include <iostream>
using namespace std;

class B; // 正确写法,在A类定义之前声明B类

class A {
  friend class B; // 声明B类为友元类
  private:
    int a;
  public:
    A(int n=0): a(n){}
};

class B {
  public:
    void func(A& obj){
      cout << obj.a << endl; // 在B类中访问A类的私有成员a
    }
};

int main() {
  A objA(10);
  B objB;
  objB.func(objA);
  return 0;
}