Последнее обновление:2026-10-12
C++ дружественность friend¶
Об авторе:¶
Личный официальный аккаунт:

0.Обзор¶
Дружественность (friend) предоставляет механизм, позволяющий обычной функции или членской функции класса обращаться к приватным или защищённым членам другого класса. То есть существует две формы дружественности:
(1)Дружественная функция: обычная функция получает доступ к приватным или защищённым членам некоторого класса.
(2)Дружественный класс: членские функции класса A обращаются к приватным или защищённым членам класса B.
Преимущества: повышает эффективность выполнения программы.
Недостатки: нарушает инкапсуляцию класса и прозрачность данных.
Резюме: - Возможен доступ к приватным членам - Нарушает инкапсуляцию - Отношения дружественности непередаваемы - Однонаправленность отношений дружественности - Форма и количество объявлений friend не ограничены
1.Дружественная функция¶
Объявляется в любой области объявления класса, а определяется вне класса.
Обратите внимание: дружественная функция — это просто обычная функция, а не членская функция класса; её можно вызывать откуда угодно, а внутри дружественной функции доступ к приватным и защищённым членам класса осуществляется через имя объекта.
Конкретный код см. в: friend_func.cpp
#include <iostream>
using namespace std;
class A
{
public:
A(int _a):a(_a){};
friend int geta(A &ca); ///< 友元函数
private:
int a;
};
int geta(A &ca)
{
return ca.a;
}
int main()
{
A a(3);
cout<<geta(a)<<endl;
return 0;
}
2.Дружественный класс¶
Объявление дружественного класса находится в объявлении данного класса, а его реализация — вне класса.
Если класс B — друг класса A, то класс B может напрямую обращаться к приватным членам A.
Конкретный код см. в: friend_class.cpp
#include <iostream>
using namespace std;
class A
{
public:
A(int _a):a(_a){};
friend class B;
private:
int a;
};
class B
{
public:
int getb(A ca) {
return ca.a;
};
};
int main()
{
A a(3);
B b;
cout<<b.getb(a)<<endl;
return 0;
}
3.Замечания¶
-
Отношения дружественности не наследуются Если класс B — друг класса A, а класс C наследует от класса A, то дружественный класс B не имеет возможности напрямую обращаться к приватным или защищённым членам класса C.
-
Отношения дружественности непередаваемы Если класс B — друг класса A, а класс C — друг класса B, то дружественный класс C не имеет возможности напрямую обращаться к приватным или защищённым членам класса A; иными словами, отношения «друг друга» не существует.
Похожие темы¶
- C++ чисто виртуальные функции и абстрактные классы | C++那些事
- C++ утверждения assert | C++那些事
- C++ битовые поля | C++那些事
- Реализация полиморфизма C++ на языке C | C++那些事
- C++ константы const и его модификация | C++那些事
- C++ всё семейство const | C++那些事
- C++ оператор разыменования * | C++那些事
- C++ инициализация и присваивание | C++那些事
- C++ возврат нескольких значений | C++那些事
- C++ ключевое слово mutable | C++那些事