Udostępnij za pośrednictwem


Zaprzyjaźnione funkcje klasy członkowskiej i klasy

Funkcje członkowskie klasy mogą być deklarowane jako przyjacielskie w innych klasach.Rozważmy następujący przykład:

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

W poprzednim przykładzie, tylko funkcja A::Func1( B& ) ma udzielany dostęp przyjacielski do klasy B.W związku z tym, dostęp do prywatnego elementu członkowskiego _b jest poprawny w Func1 klasy A , ale nie w Func2.

Klasa friend jest klasą, której wszystkie funkcje członkowskie są funkcje przyjacielskimi klasy, oznacza to, że funkcje członkowskie mają dostęp do prywatnych i chronionych elementów członkowskich innych klas.Załóżmy, że deklaracja friend w klasie B była:

friend class A;

W takim przypadku, wszystkie funkcje członkowskie w klasie A mogą otrzymać dostęp przyjacielski do klasy B.Następujący kod jest przykładem klasy przyjacielskiej:

// 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();
}

Przyjaźń nie jest wzajemne, o ile nie została jawnie określona jako taka.W powyższym przykładzie funkcje członkowskie z YourClass nie mają dostępu do prywatnych elementów członkowskich z YourOtherClass.

Typ zarządzany nie może mieć żadnych funkcji przyjacielskich, przyjacielskich klas lub interfejsów przyjacielskich.

Przyjaźń nie jest dziedziczona, co oznacza, że klasy pochodne YourOtherClass nie mają dostępu do prywatnych elementów członkowskich YourClass.Przyjaźń nie jest przechodnia, więc klasy, które są przyjacielskie dla YourOtherClass nie mają dostępu do prywatnych elementów członkowskich YourClass.

Na poniższej ilustracji pokazano cztery deklaracje klas: Base, Derived, aFriend i anotherFriend.Tylko klasa aFriend ma bezpośredni dostęp do prywatnych elementów członkowskich Base (oraz do wszystkich elementów członkowskich Base, które mogą być dziedziczone).

Implikacje relacji przyjacielskiej

Skutki relacji znajomego

Zobacz też

Informacje

friend (C++)