Friend

czarownik

friend - słowo kluczowe języka C++.

Funkcje

Friend jest to modyfikator, który stawiamy przy deklaracji funkcji (przed deklaracją) w klasie. Wiadomo, że tworząc klasę, niektóre/wszystkie składowe są prywatne, jednak jeśli w takiej przykładowej klasie zadeklarujemy funkcję z modyfikatorem friend (poinformujemy kompilator o przyjaźni) to ta właśnie funkcja będzie mogła operować na tych składowych. Kompilator języka C++ rozumie taką sytuację dosłownie tak: schowaj prywatne dane ([[c/private]]) klasy X przed wszystkimi funkcjami oprócz tych ze słówkiem friend przed ich definicją. Tak więc widzimy, że to nie funkcja wie, że jest zaprzyjaźniona z dana klasą, a właśnie ta klasa zdaje sobie sprawę z tego, iż może pozwolić na operowanie swoimi składowymi przez dana funkcję. Czym więc różni się funkcja zaprzyjaźniona od funkcji składowej? Ano tym, że może być wiele klas, które są zaprzyjaźnione z tą samą funkcją. Oto przykład:
class klasa
{
  int liczba; // wiadomo, że standardowo składowe klasy są prywatne
  public:
    friend void wyswietl(klasa&);  // deklaracja funkcji zaprzyjaźnionej
};

void wyswietl(klasa& kl)
{
  cout << "liczba z klasy to: " << kl.liczba << endl;
}

int main()
{
  klasa kla;
  wyswietl(kla);
  return 0;
}

Jak pewnie zauważyliście, funkcja zaprzyjaźniona nie jest definiowana na rzecz danej klasy. Dodam jeszcze, że taka funkcja nie posiada wskaźnika this, ale jeśli jest funkcją zaprzyjaźnioną, oznacza to, że w jakiś sposób musi dostać się do danego obiektu - stąd ta instrukcja kl.liczba. Należy pamiętać jednak o tym, że funkcja jest zaprzyjaźniona z klasą, co oznacza że ma takie same prawa do wszystkich obiektów tej samej klasy.

Klasy zaprzyjaźnione

Zacznę może od przykładu:
class klasa1
{ 
  friend class klasa2;
  //...
};

Zasada jest prosta: w tym przypadku deklaracja ta sprawia, że wszystkie składowe klasy klasa2 są zaprzyjaźnione z klasą klasa1. Przyjaźń ta nie jest wzajemna, tzn. klasa1 nie jest zaprzyjaźniona z klasa2, czyli na odwrót. Nie ma zachowanej przechodniości, czyli NIE zachodzi taka sytuacja: jeśli klasa1 jest zaprzyjaźniona do klasa2 i klasa2 jest zaprzyjaźniona z klasa3 to klasa1 jest zaprzyjaźniona z klasa3 - zwracam uwagę na słowo NIE.

2 komentarzy

Jednak powinno być "przechodniości". Z teorii mnogości wiemy, że jest prawdą iż, jeśli A implikuje B oraz B implikuje C to A implikuje C. W naszym przypadku jeśli funkcja A przyjaźni się z B, a funkcja B z C to wcale nie oznacza to, że A przyjaźni się z C.
Pozdrawiam serdecznie.

Takie małe moje pytanie. W tekście było napisane: "przechodniości". Poprawiłem na "przechodności". Mam nadzieję, że dobrze? :) Bo nie wiem czemu, ale mam jakoś małe wątpliwości, czy napewno dobrze :]