V tej vadnici se bomo s pomočjo primerov naučili ustvarjati funkcije prijateljev in razrede prijateljev v jeziku C ++.
Skrivanje podatkov je temeljni koncept objektno usmerjenega programiranja. Omejuje dostop zasebnih članov zunaj predavanja.
Podobno lahko do zaščitenih članov dostopajo le izpeljani razredi in so od zunaj nedostopni. Na primer
class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )
Vendar pa v C ++ obstaja funkcija, imenovana prijateljske funkcije, ki krši to pravilo in nam omogoča dostop do funkcij članov zunaj razreda.
Podobno obstaja tudi razred prijateljev , ki se ga bomo naučili kasneje v tej vadnici.
prijatelj Funkcija v jeziku C ++
Funkcija prijatelja lahko dostopa do zasebnih in zaščitenih podatkov razreda. Funkcijo prijatelja razglasimo s friend
ključno besedo znotraj telesa razreda.
class className (… friend returnType functionName(arguments);… )
Primer 1: Delovanje prijatelja Funkcija
// 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; )
Izhod
Razdalja: 5
Tu addFive()
je funkcija prijatelja, ki lahko dostopa do zasebnih in javnih članov podatkov.
Čeprav nam ta primer daje predstavo o konceptu funkcije prijatelja, ne kaže nobene smiselne uporabe.
Bolj smiselna uporaba bi bila uporaba predmetov dveh različnih razredov. Takrat je lahko funkcija prijatelja zelo koristna.
2. primer: dodajte člane dveh različnih razredov
// 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; )
Izhod
Vsota: 13
V tem programu, ClassA
in ClassB
so izjavili, add()
kot funkcija prijatelje. Tako lahko ta funkcija dostopa do zasebnih podatkov obeh razredov.
Tu je treba opaziti, da funkcija prijatelja znotraj ClassA
uporablja ClassB
. Vendar ClassB
v tem trenutku še nismo določili .
// inside classA friend int add(ClassA, ClassB);
Da bi to delovalo, potrebujemo predhodno izjavo o ClassB
našem programu.
// forward declaration class ClassB;
prijatelj Razred v jeziku C ++
Lahko uporabimo tudi razred prijateljev v jeziku C ++ z uporabo friend
ključne besede. Na primer
class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )
Ko je razred razglašen za razred prijatelja, vse članske funkcije razreda prijateljev postanejo prijateljske funkcije.
Ker classB
gre za tečaj prijateljev, lahko do njega dostopamo classA
od znotraj classB
.
Vendar člani ne moremo dostopati ClassB
od znotraj classA
. Razlog za to, da je prijateljski odnos v jeziku C ++ odobren, ne pa tudi sprejet.
Primer 3: Razred prijatelja 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; )
Izhod
Vsota: 13
Tukaj ClassB
je razred prijateljev ClassA
. Torej, ClassB
ima dostop do članov classA
.
V letu ClassB
smo ustvarili funkcijo, add()
ki vrne vsoto numA in numB.
Ker ClassB
gre za razred prijateljev, lahko ustvarjamo predmete ClassA
znotraj ClassB
.