Selles õpetuses õpime näidete abil looma sõprade funktsioone ja sõbraklasse C ++ keeles.
Andmete varjamine on objektorienteeritud programmeerimise põhimõiste. See piirab eraisikute liikmete juurdepääsu väljastpoolt klassi.
Samamoodi saavad kaitstud liikmed juurde pääseda ainult tuletatud klasside kaudu ja neile ei pääse väljastpoolt. Näiteks,
class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )
Kuid C ++ -s on funktsioon, mida nimetatakse sõbrafunktsioonideks, mis rikub seda reeglit ja võimaldab meil liikmefunktsioonidele juurde pääseda väljaspool klassi.
Samamoodi on sõbrale klassi samuti, mida me õppida hiljem õpetamisel.
sõbra funktsioon funktsioonis C ++
Sõbrale funktsiooni pääseb era- ja kaitstud andmete klassi. Kuulutame sõbrafunktsiooni, kasutades friend
klassi kehas asuvat märksõna.
class className (… friend returnType functionName(arguments);… )
Näide 1: Sõbra funktsiooni töö
// 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äljund
Kaugus: 5
Siin addFive()
on sõbrafunktsioon, millel on juurdepääs nii era- kui ka avalikele andmetele.
Kuigi see näide annab meile ettekujutuse sõbrafunktsiooni kontseptsioonist, ei näita see siiski mingit tähenduslikku kasutamist.
Sisukam kasutamine oleks kahe erineva klassi objektide opereerimine. Siis võib sõbrafunktsioon olla väga kasulik.
Näide 2: lisage kahte erinevat klassi liikmeid
// 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äljund
Summa: 13
Selles programmis, ClassA
ja ClassB
on deklareeritud add()
sõbraks funktsiooni. Seega saab selle funktsiooniga juurde pääseda mõlema klassi privaatsetele andmetele.
Üks asi, mida tähele siin on sõbrale funktsiooni sees ClassA
kasutab ClassB
. ClassB
Siinkohal pole me siiski määratlenud .
// inside classA friend int add(ClassA, ClassB);
Selle toimimiseks vajame ClassB
oma programmis edasist deklaratsiooni .
// forward declaration class ClassB;
sõbraklass C ++ klassis
friend
Märksõna abil saame kasutada ka sõbraklassi C ++ -s . Näiteks,
class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )
Kui klass kuulutatakse sõbraklassiks, muutuvad kõik sõbraklassi liikmefunktsioonid sõbrafunktsioonideks.
Kuna see classB
on sõbraklass, pääseme kõigile liikmetele juurde classA
seestpoolt classB
.
Kuid me ei pääse liikmetele ClassB
sisse seestpoolt classA
. Selle põhjuseks on asjaolu, et sõbrasuhe C ++ keeles antakse ainult, mitte võetakse.
Näide 3: C ++ sõbraklass
// 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äljund
Summa: 13
Siin ClassB
on sõber klass ClassA
. Niisiis, ClassB
tal on juurdepääs ettevõtte liikmetele classA
.
Aastal ClassB
oleme loonud funktsiooni, add()
mis tagastab numA ja numB summa.
Kuna see ClassB
on sõbraklass, saame luua objektid selle ClassA
sisemusest ClassB
.