В C++ дружественная функция — это функция, объявленная с ключевым словом friend в теле класса, но определенная вне класса. Дружественные функции не являются функциями-членами класса, но они имеют доступ к закрытым и защищенным членам класса.

Объявление функции другом позволяет функции получить доступ к закрытым и защищенным членам класса. Это часто используется, чтобы позволить функции выполнять операции над классом, которые в противном случае были бы запрещены элементами управления доступом класса.

Вот пример класса с функцией друга:

class MyClass {
 private:
  int x;
  friend void myFriendFunction(MyClass& obj);
};
void myFriendFunction(MyClass& obj) {
  // Access the private members of obj
  obj.x = 10;
}

Дружественный класс — это класс, объявленный с ключевым словом friend в теле класса другого класса. Подобно дружественным функциям, дружественные классы не являются членами класса, в котором они объявлены, но они имеют доступ к закрытым и защищенным членам класса.

Вот пример класса с классом друга:

class MyClass {
 private:
  int x;
  friend class MyFriendClass;
};

class MyFriendClass {
 public:
  void doSomething(MyClass& obj) {
    // Access the private members of obj
    obj.x = 10;
  }
};

Дружба не транзитивна. Например, если класс B является другом класса A, а класс C является другом класса B, класс C не становится автоматически другом класса A. Дружба должна быть явно объявлена ​​в каждом классе.