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.
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 :]