Перейти к содержанию

Последнее обновление:2026-10-12

C++ дружественность friend

Об авторе:

Личный официальный аккаунт:

wechat

0.Обзор

Дружественность (friend) предоставляет механизм, позволяющий обычной функции или членской функции класса обращаться к приватным или защищённым членам другого класса. То есть существует две формы дружественности:

(1)Дружественная функция: обычная функция получает доступ к приватным или защищённым членам некоторого класса.

(2)Дружественный класс: членские функции класса A обращаются к приватным или защищённым членам класса B.

Преимущества: повышает эффективность выполнения программы.

Недостатки: нарушает инкапсуляцию класса и прозрачность данных.

Резюме: - Возможен доступ к приватным членам - Нарушает инкапсуляцию - Отношения дружественности непередаваемы - Однонаправленность отношений дружественности - Форма и количество объявлений friend не ограничены

1.Дружественная функция

Объявляется в любой области объявления класса, а определяется вне класса.

friend <类型><友元函数名>(<参数表>);

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

Конкретный код см. в: 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.Дружественный класс

Объявление дружественного класса находится в объявлении данного класса, а его реализация — вне класса.

friend class <友元类名>;

Если класс 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; иными словами, отношения «друг друга» не существует.

Похожие темы

Комментарии