Funkce a třídy přátel C ++ (s příklady)

V tomto kurzu se naučíme vytvářet funkce přátel a třídy přátel v C ++ pomocí příkladů.

Skrývání dat je základní koncepcí objektově orientovaného programování. Omezuje přístup soukromých členů mimo třídu.

Podobně k chráněným členům mají přístup pouze odvozené třídy a jsou nepřístupné zvenčí. Například,

 class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )

V jazyce C ++ však existuje funkce zvaná funkce přítele, které porušují toto pravidlo a umožňují nám přístup k členským funkcím mimo třídu.

Podobně existuje i třída přátel , které se naučíme dále v tomto kurzu.

friend Funkce v C ++

Funkce přátel má přístup k soukromým a chráněným datům třídy. Deklarujeme funkci přítele pomocí friendklíčového slova uvnitř těla třídy.

 class className (… friend returnType functionName(arguments);… )

Příklad 1: Práce přítele Funkce

 // C++ program to demonstrate the working of friend function #include using namespace std; class Distance ( private: int meter; // friend function friend int addFive(Distance); public: Distance() : meter(0) () ); // friend function definition int addFive(Distance d) ( //accessing private members from the friend function d.meter += 5; return d.meter; ) int main() ( Distance D; cout << "Distance: " << addFive(D); return 0; )

Výstup

 Vzdálenost: 5

Zde addFive()je funkce přátel, která má přístup k soukromým i veřejným datovým členům.

Ačkoli tento příklad nám dává představu o konceptu funkce přítele, nevykazuje žádné smysluplné použití.

Smysluplnější využití by bylo provozování na objektech dvou různých tříd. Tehdy může být funkce přátel velmi užitečná.

Příklad 2: Přidejte členy dvou různých tříd

 // Add members of two different classes using friend functions #include using namespace std; // forward declaration class ClassB; class ClassA ( public: // constructor to initialize numA to 12 ClassA() : numA(12) () private: int numA; // friend function declaration friend int add(ClassA, ClassB); ); class ClassB ( public: // constructor to initialize numB to 1 ClassB() : numB(1) () private: int numB; // friend function declaration friend int add(ClassA, ClassB); ); // access members of both classes int add(ClassA objectA, ClassB objectB) ( return (objectA.numA + objectB.numB); ) int main() ( ClassA objectA; ClassB objectB; cout << "Sum: " << add(objectA, objectB); return 0; )

Výstup

 Součet: 13

V rámci tohoto programu, ClassAa ClassBdeklarovali add()jako funkce přítele. Tato funkce tedy může přistupovat k soukromým datům obou tříd.

Jedna věc, kterou si zde musíte všimnout, je, že funkce přítele uvnitř ClassApoužívá ClassB. V ClassBtuto chvíli jsme však nedefinovali .

 // inside classA friend int add(ClassA, ClassB);

Aby to fungovalo, potřebujeme ClassBv našem programu dopřednou deklaraci .

 // forward declaration class ClassB;

friend Class v C ++

Můžeme také použít třídu přítele v C ++ pomocí friendklíčového slova. Například,

 class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )

Když je třída prohlášena za třídu přátel, všechny členské funkce třídy přátel se stanou funkcemi přátel.

Jelikož classBje třída přátel, můžeme přistupovat ke všem členům classAzevnitř classB.

K členům ClassBzevnitř však nemůžeme přistupovat classA. Je to proto, že přátelský vztah v C ++ je pouze poskytnut, nikoli vzat.

Příklad 3: Třída přítele C ++

 // C++ program to demonstrate the working of friend class #include using namespace std; // forward declaration class ClassB; class ClassA ( private: int numA; // friend class declaration friend class ClassB; public: // constructor to initialize numA to 12 ClassA() : numA(12) () ); class ClassB ( private: int numB; public: // constructor to initialize numB to 1 ClassB() : numB(1) () // member function to add numA // from ClassA and numB from ClassB int add() ( ClassA objectA; return objectA.numA + numB; ) ); int main() ( ClassB objectB; cout << "Sum: " << objectB.add(); return 0; )

Výstup

 Součet: 13

Tady ClassBje třída přátel ClassA. Takže ClassBmá přístup ke členům classA.

V rámci ClassBjsme vytvořili funkci, add()která vrací součet numA a numB.

Protože ClassBje to třída přátel, můžeme vytvářet objekty ClassAuvnitř ClassB.

Zajímavé články...