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 friend
kľúč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 ClassA
a ClassB
vyhlá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 ClassA
používa ClassB
. V ClassB
tejto chvíli sme to však nedefinovali .
// inside classA friend int add(ClassA, ClassB);
Aby to fungovalo, potrebujeme ClassB
v našom programe ďalšie vyhlásenie o .
// forward declaration class ClassB;
friend Class v C ++
Pomocou friend
kľúč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 classB
je to trieda priateľov, máme prístup ku všetkým členom classA
zvnútra classB
.
Nemôžeme však získať prístup k členom ClassB
zvnú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 ClassB
je trieda priateľov ClassA
. Takže ClassB
má prístup k členom classA
.
V rámci ClassB
sme vytvorili funkciu, add()
ktorá vracia súčet numA a numB.
Pretože ClassB
je to trieda priateľov, môžeme vytvárať objekty vo ClassA
vnútri ClassB
.