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


Функции и классы члена класса как друзья

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

// 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

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

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

friend class A;

В этом случае все функции-члены в классе A предоставил доступ к классу friend 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's закрытые члены.Приятельство не транзитивно, классы которых друзей YourOtherClass не удалось получить доступ YourClass's закрытые члены.

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

Влияние дружественные отношения

График реализаций дружественных отношений

См. также

Ссылки

friend (C++)