C ++ priateľské funkcie a triedy (s príkladmi)

V tomto tutoriále sa naučíme pomocou funkcií príkladov vytvárať funkcie priateľa a triedy priateľov v C ++.

Skrývanie údajov je základnou koncepciou objektovo orientovaného programovania. Obmedzuje prístup súkromných členov mimo triedy.

Podobne k chráneným členom majú prístup iba odvodené triedy a sú zvonku neprístupné. Napríklad,

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

V C ++ však existuje vlastnosť nazývaná priateľské funkcie, ktoré porušujú toto pravidlo a umožňujú nám prístup k členským funkciám aj mimo triedy.

Podobne existuje aj trieda priateľov , ktorej sa naučíme neskôr v tomto tutoriále.

friend Funkcia v C ++

Funkcia priateľa má prístup k súkromným a chráneným údajom triedy. Funkciu priateľa deklarujeme pomocou friendkľúčového slova v tele triedy.

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

Príklad 1: Práca priateľa Funkcia

 // 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ýkon

 Vzdialenosť: 5

Tu addFive()je funkcia priateľa, ktorá má prístup k súkromným aj verejným dátovým členom.

Aj keď tento príklad poskytuje predstavu o koncepte funkcie priateľa, neukazuje nijaké zmysluplné využitie.

Zmysluplnejšie využitie by bolo pôsobenie na objekty dvoch rôznych tried. Vtedy môže byť funkcia priateľa veľmi užitočná.

Príklad 2: Pridajte členov dvoch rôznych tried

 // 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ýkon

 Súčet: 13

V tomto programe ClassAa ClassBvyhlásili add()za funkciu priateľa. Táto funkcia teda môže pristupovať k súkromným údajom oboch tried.

Jedna vec, ktorú si tu treba všimnúť, je, že funkcia priateľa vo vnútri ClassApoužíva ClassB. V ClassBtejto chvíli sme to však nedefinovali .

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

Aby to fungovalo, potrebujeme ClassBv našom programe ďalšie vyhlásenie o .

 // forward declaration class ClassB;

friend Class v C ++

Pomocou friendkľúčového slova môžeme tiež použiť triedu priateľa v C ++ . Napríklad,

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

Keď je trieda vyhlásená za triedu priateľov, všetky členské funkcie triedy priateľov sa stanú funkciami priateľa.

Pretože classBje to trieda priateľov, máme prístup ku všetkým členom classAzvnútra classB.

Nemôžeme však získať prístup k členom ClassBzvnútra classA. Je to preto, lebo priateľský vzťah v C ++ je iba poskytnutý, nie braný.

Príklad 3: C ++ trieda priateľa

 // 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ýkon

 Súčet: 13

Tu ClassBje trieda priateľov ClassA. Takže ClassBmá prístup k členom classA.

V rámci ClassBsme vytvorili funkciu, add()ktorá vracia súčet numA a numB.

Pretože ClassBje to trieda priateľov, môžeme vytvárať objekty vo ClassAvnútri ClassB.

Zaujímavé články...