A třída přátel má přístup k soukromým a chráněným členům jiných tříd, ve kterých je deklarován jako přítel. Někdy je užitečné povolit určité třídě přístup k soukromým a chráněným členům jiných tříd. Například třídě LinkedList může být povolen přístup k soukromým členům Node.
Můžeme deklarovat třídu přátel v C++ pomocí přítel klíčové slovo.
Syntax:
friend class class_name; // declared in the base class>

Třída přátel
Příklad:
runas v powershellC++
// 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; }> Výstup
The value of Private Variable = 10 The value of Protected Variable = 99>
Poznámka: Můžeme deklarovat třídu přátel nebo funkci kdekoli v těle základní třídy, ať už jde o soukromý, chráněný nebo veřejný blok. Funguje to úplně stejně.
Funkce přítele
Stejně jako třída přátel může být funkci přítele udělen speciální přístup k soukromým a chráněným členům třídy v C++. Nejsou členskými funkcemi třídy, ale mohou přistupovat k soukromým a chráněným členům této třídy a manipulovat s nimi, protože jsou deklarováni jako přátelé.
Funkce přítele může být:
- Globální funkce
- Členská funkce jiné třídy

Funkce Friend v C++
Syntax:
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>

Syntaxe funkce přítele
1. Globální funkce jako funkce přítele
Jakoukoli globální funkci můžeme deklarovat jako funkci přítele. Následující příklad ukazuje, jak deklarovat globální funkci jako přátelskou funkci v C++:
Příklad:
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; }> Výstup
Private Variable: 10 Protected Variable: 99>
Ve výše uvedeném příkladu jsme jako funkci přítele použili globální funkci. V dalším příkladu použijeme členskou funkci jiné třídy jako funkci přítele.
2. Členská funkce jiné třídy jako funkce přítele
Členskou funkci jiné třídy můžeme také deklarovat jako přátelskou funkci v C++. Následující příklad ukazuje, jak použít členskou funkci jiné třídy jako funkci přítele v C++:
Příklad:
C++ // 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; }> Výstup
Private Variable: 10 Protected Variable: 99>
Poznámka : Pořadí, ve kterém definujeme funkci přítele jiné třídy, je důležité a mělo by se o něj dbát. Před definicí funkce musíme vždy definovat obě třídy. Proto jsme použili definici členské funkce mimo třídy.
Vlastnosti funkcí přátel
- Funkce přítele je speciální funkce v C++, ke které má oprávnění, přestože není členskou funkcí třídy přístup a soukromá a chráněná data třídy.
- Funkce přítele je nečlenská funkce nebo běžná funkce třídy, která je deklarována jako přítel pomocí klíčového slova přítel uvnitř třídy. Deklarováním funkce jako přítele jsou funkci udělena všechna přístupová oprávnění.
- Klíčové slovo přítel je umístěno pouze v deklaraci funkce funkce přítel a ne v definice funkce nebo volání.
- Funkce přítele se nazývá jako běžná funkce. Nelze jej volat pomocí názvu objektu a operátoru tečky. Může však přijmout objekt jako argument, k jehož hodnotě chce získat přístup.
- Funkce přítele může být deklarována v jakékoli části třídy, tj. veřejná nebo soukromá nebo chráněná.
Níže jsou uvedeny některé další příklady funkcí přátel v různých scénářích:
Funkce přátelská k více třídám
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; }> Výstup
35>
Funkce přítel nám poskytuje způsob přístupu k soukromým údajům, ale má také své nevýhody. Níže je uveden seznam výhod a nevýhod funkcí přátel v C++:
Výhody funkcí přátel
- Funkce přátel má přístup ke členům, aniž by bylo nutné zdědit třídu.
- Funkce přítel funguje jako most mezi dvěma třídami tím, že přistupuje k jejich soukromým datům.
- Lze jej použít ke zvýšení všestrannosti přetížených operátorů.
- Může být deklarován buď ve veřejné, soukromé nebo chráněné části třídy.
Nevýhody funkcí přátel
- Funkce přátel mají přístup k soukromým členům třídy mimo třídu, což porušuje zákon o skrývání dat.
- Funkce přátel nemohou ve svých členech provádět žádný polymorfismus za běhu.
Důležité body o funkcích a třídách přátel
- Přátelé by se měli používat pouze pro omezené účely. Příliš mnoho funkcí nebo externích tříd je deklarováno jako přátelé třídy s chráněným nebo soukromým přístupem k datům, což snižuje hodnotu zapouzdření samostatných tříd v objektově orientovaném programování.
- Přátelství je ne vzájemné . Pokud je třída A přítelem B, pak se B automaticky nestává přítelem A.
- Přátelství se nedědí. (Vidět tento Více podrobností)
- Koncept přátel není v Javě.