# C++ 中的友元类和友元函数

> 原文： [https://beginnersbook.com/2017/09/friend-class-and-friend-functions/](https://beginnersbook.com/2017/09/friend-class-and-friend-functions/)

我们知道一个类无法访问其他类的私有成员。类似地，不继承另一个类的类不能访问其受保护的成员。

**友元类：**

**友元类**是一个类，可以访问被声明为**友元**的类的私有成员和受保护成员。当我们想要允许特定类访问类的私有成员和受保护成员时，这是必需的。

## 函数类示例

在这个例子中，我们有两个类`XYZ`和`ABC`。 `XYZ`类有两个私有数据成员`ch`和`num`，这个类将`ABC`声明为友元类。这意味着`ABC`可以访问`XYZ`的私有成员，在`ABC`类的函数`disp()`访问私有成员`num`和`ch`的示例中也证明了这一点。在这个例子中，我们[将对象作为参数传递给函数](https://beginnersbook.com/2017/09/cpp-pass-and-return-object-from-a-function/)。

```cpp
#include <iostream>
using namespace std;
class XYZ {
private:
   char ch='A';
   int num = 11;
public:
   /* This statement would make class ABC
    * a friend class of XYZ, this means that
    * ABC can access the private and protected
    * members of XYZ class. 
    */
   friend class ABC;
};
class ABC {
public:
   void disp(XYZ obj){
      cout<<obj.ch<<endl;
      cout<<obj.num<<endl;
   }
};
int main() {
   ABC obj;
   XYZ obj2;
   obj.disp(obj2);
   return 0;
}
```

**输出：**

```cpp
A
11
```

**友元函数：**

与友元类相似，此函数可以访问另一个类的私有和受保护成员。全局函数也可以声明为友元，如下例所示：

## 友元函数示例

```cpp
#include <iostream>
using namespace std;
class XYZ {
private:
   int num=100;
   char ch='Z';
public:
   friend void disp(XYZ obj);
};
//Global Function
void disp(XYZ obj){
   cout<<obj.num<<endl; 
   cout<<obj.ch<<endl;
}
int main() {
   XYZ obj;
   disp(obj);
   return 0;
}
```

**输出：**

```cpp
100
Z
```