Поделиться через


Функции членов классов и классы как дружественные элементы

Функции-члены класса могут быть объявлены в других классах как дружественные. Рассмотрим следующий пример:

// classes_as_friends1.cpp
// compile with: /c
class B;

class A {
public:
   int Func1( B& b );

private:
   int Func2( B& b );
};

class B {
private:
   int _b;

   // A::Func1 is a friend function to class B
   // so A::Func1 has access to all members of B
   friend int A::Func1( B& );
};

int A::Func1( B& b ) { return b._b; }   // OK
int A::Func2( B& b ) { return b._b; }   // C2248

В предыдущем примере дружественный доступ к классу B предоставляется только функции A::Func1( B& ). Поэтому доступ к закрытому члену _b допускается только в функции Func1 класса A , но не в функции Func2.

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

friend class A;

В этом случае все функции-члены из класса A имели бы дружественный доступ к классу B. В следующем коде приведен пример дружественного класса.

// classes_as_friends2.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
class YourClass {
friend class YourOtherClass;  // Declare a friend class
public:
   YourClass() : topSecret(0){}
   void printMember() { cout << topSecret << endl; }
private:
   int topSecret;
};

class YourOtherClass {
public:
   void change( YourClass& yc, int x ){yc.topSecret = x;}
};

int main() {
   YourClass yc1;
   YourOtherClass yoc1;
   yc1.printMember();
   yoc1.change( yc1, 5 );
   yc1.printMember();
}

Дружественные отношения не являются взаимными, если это не указано явным образом. В предыдущем примере функции-члены класса YourClass не имеют доступа к закрытым членам класса YourOtherClass.

Управляемый тип не может иметь дружественные функции, классы и интерфейсы.

Дружественные отношения не наследуются; это означает, что классы, производные от YourOtherClass, не могут обращаться к закрытым членам класса YourClass. Дружественные отношения не являются переходящими, поэтому классы, дружественные классу YourOtherClass, не могут обращаться к закрытым членам класса YourClass.

На следующем рисунке показаны объявления 4 классов: Base, Derived, aFriend и anotherFriend. Только класс aFriend имеет прямой доступ к закрытым членам класса Base (и к любым возможным унаследованным членам класса Base).

Следствия дружественных отношений

Последствия дружественных отношений

См. также

Ссылки

friend (C++)