A klasa przyjaciół może uzyskać dostęp do prywatnych i chronionych członków innych klas, w których jest zadeklarowany jako przyjaciel. Czasami przydatne jest umożliwienie określonej klasie dostępu do prywatnych i chronionych członków innych klas. Na przykład klasa LinkedList może mieć dostęp do prywatnych elementów członkowskich Node.
Możemy zadeklarować klasę zaprzyjaźnioną w C++ za pomocą metody przyjaciel słowo kluczowe.
Zastępowanie metody w Javie
Składnia:
friend class class_name; // declared in the base class>

Klasa przyjaciela
Przykład:
C++
// C++ Program to demonstrate the // functioning of a friend class #include using namespace std; class GFG { private: int private_variable; protected: int protected_variable; public: GFG() { private_variable = 10; protected_variable = 99; } // friend class declaration friend class F; }; // Here, class F is declared as a // friend inside class GFG. Therefore, // F is a friend of class GFG. Class F // can access the private members of // class GFG. class F { public: void display(GFG& t) { cout << 'The value of Private Variable = ' << t.private_variable << endl; cout << 'The value of Protected Variable = ' << t.protected_variable; } }; // Driver code int main() { GFG g; F fri; fri.display(g); return 0; }> Wyjście
The value of Private Variable = 10 The value of Protected Variable = 99>
Notatka: Możemy zadeklarować zaprzyjaźnioną klasę lub funkcję w dowolnym miejscu ciała klasy bazowej, niezależnie od tego, czy jest to blok prywatny, chroniony czy publiczny. To działa tak samo.
Funkcja przyjaciela
Podobnie jak klasa zaprzyjaźniona, funkcja zaprzyjaźniona może otrzymać specjalny dostęp do prywatnych i chronionych członków klasy w C++. Nie są to funkcje członkowskie klasy, ale mogą uzyskiwać dostęp do prywatnych i chronionych członków tej klasy i manipulować nimi, ponieważ są zadeklarowani jako przyjaciele.
Funkcja przyjaciela może być:
- Funkcja globalna
- Funkcja członkowska innej klasy

Funkcja przyjaciela w C++
usuń pierwszy znak Excel
Składnia:
friend return_type function_name (arguments); // for a global function or friend return_type class_name::function_name (arguments); // for a member function of another class>

Składnia funkcji przyjaciela
1. Funkcja globalna jako funkcja przyjaciela
Możemy zadeklarować dowolną funkcję globalną jako funkcję zaprzyjaźnioną. Poniższy przykład ilustruje, jak zadeklarować funkcję globalną jako funkcję zaprzyjaźnioną w C++:
Przykład:
C++ // C++ program to create a global function as a friend // function of some class #include using namespace std; class base { private: int private_variable; protected: int protected_variable; public: base() { private_variable = 10; protected_variable = 99; } // friend function declaration friend void friendFunction(base& obj); }; // friend function definition void friendFunction(base& obj) { cout << 'Private Variable: ' << obj.private_variable << endl; cout << 'Protected Variable: ' << obj.protected_variable; } // driver code int main() { base object1; friendFunction(object1); return 0; }> Wyjście
Private Variable: 10 Protected Variable: 99>
W powyższym przykładzie użyliśmy funkcji globalnej jako funkcji zaprzyjaźnionej. W następnym przykładzie użyjemy funkcji członkowskiej innej klasy jako funkcji zaprzyjaźnionej.
2. Funkcja składowa innej klasy jako funkcja przyjaciela
Możemy także zadeklarować funkcję członkowską innej klasy jako funkcję zaprzyjaźnioną w C++. Poniższy przykład ilustruje sposób użycia funkcji członkowskiej innej klasy jako funkcji zaprzyjaźnionej w C++:
Przykład:
równa się ciągowi w JavieC++
// C++ program to create a member function of another class // as a friend function #include using namespace std; class base; // forward definition needed // another class in which function is declared class anotherClass { public: void memberFunction(base& obj); }; // base class for which friend is declared class base { private: int private_variable; protected: int protected_variable; public: base() { private_variable = 10; protected_variable = 99; } // friend function declaration friend void anotherClass::memberFunction(base&); }; // friend function definition void anotherClass::memberFunction(base& obj) { cout << 'Private Variable: ' << obj.private_variable << endl; cout << 'Protected Variable: ' << obj.protected_variable; } // driver code int main() { base object1; anotherClass object2; object2.memberFunction(object1); return 0; }> Wyjście
Private Variable: 10 Protected Variable: 99>
Notatka : Kolejność, w jakiej definiujemy funkcję przyjaciela innej klasy, jest ważna i należy o nią zadbać. Zawsze musimy zdefiniować obie klasy przed definicją funkcji. Dlatego użyliśmy definicji funkcji składowej spoza klasy.
Funkcje funkcji znajomych
- Funkcja zaprzyjaźniona to specjalna funkcja w C++, do której ma uprawnienia, mimo że nie jest funkcją członkowską klasy dostęp the dane prywatne i chronione z klasy.
- Funkcja zaprzyjaźniona to funkcja niebędąca członkiem lub zwykła funkcja klasy, która jest deklarowana jako zaprzyjaźniona za pomocą słowa kluczowego przyjaciel wewnątrz klasy. Deklarując funkcję jako zaprzyjaźnioną, nadawane są jej wszystkie uprawnienia dostępu.
- Słowo kluczowe przyjaciel jest umieszczane tylko w deklaracji funkcji funkcji znajomego i nie w definicja funkcji lub wywołanie.
- Funkcja zaprzyjaźniona jest wywoływana jak zwykła funkcja. Nie można go wywołać za pomocą nazwy obiektu i operatora kropki. Może jednak zaakceptować obiekt jako argument, do którego wartości chce uzyskać dostęp.
- Funkcję znajomego można zadeklarować w dowolnej sekcji klasy, tj. publicznej, prywatnej lub chronionej.
Poniżej znajduje się kilka przykładów funkcji znajomych w różnych scenariuszach:
Funkcja przyjazna wielu klasom
C++ // C++ Program to demonstrate // how friend functions work as // a bridge between the classes #include using namespace std; // Forward declaration class ABC; class XYZ { int x; public: void set_data(int a) { x = a; } friend void max(XYZ, ABC); }; class ABC { int y; public: void set_data(int a) { y = a; } friend void max(XYZ, ABC); }; void max(XYZ t1, ABC t2) { if (t1.x>t2.y) cout<< t1.x; else cout << t2.y; } // Driver code int main() { ABC _abc; XYZ _xyz; _xyz.set_data(20); _abc.set_data(35); // calling friend function max(_xyz, _abc); return 0; }> Wyjście
35>
Funkcja znajomego zapewnia nam dostęp do prywatnych danych, ale ma też swoje wady. Poniżej znajduje się lista zalet i wad funkcji zaprzyjaźnionych w C++:
Zalety funkcji znajomych
- Funkcja znajomego może uzyskać dostęp do członków bez konieczności dziedziczenia klasy.
- Funkcja znajomego działa jako pomost między dwiema klasami, uzyskując dostęp do ich prywatnych danych.
- Można go wykorzystać w celu zwiększenia wszechstronności przeciążonych operatorów.
- Można go zadeklarować w publicznej, prywatnej lub chronionej części klasy.
Wady funkcji przyjaciela
- Funkcje znajomych mają dostęp do prywatnych członków klasy spoza klasy, co narusza prawo ukrywania danych.
- Funkcje zaprzyjaźnione nie mogą wykonywać żadnego polimorfizmu w swoich składowych.
Ważne uwagi dotyczące funkcji i klas znajomych
- Przyjaciół należy używać wyłącznie w ograniczonych celach. Zbyt wiele funkcji lub klas zewnętrznych jest deklarowanych jako przyjaciele klasy z chronionym lub prywatnym dostępem do danych, co zmniejsza wartość enkapsulacji oddzielnych klas w programowaniu obiektowym.
- Przyjaźń to nie wzajemne . Jeśli klasa A jest przyjacielem B, to B nie staje się automatycznie przyjacielem A.
- Przyjaźń nie jest dziedziczona. (Widzieć Ten po więcej szczegółów)
- Koncepcja przyjaciół nie istnieje w Javie.