U ovom uputstvu naučit ćemo stvarati funkcije prijatelja i klase prijatelja na C ++ uz pomoć primjera.
Sakrivanje podataka temeljni je koncept objektno orijentiranog programiranja. Ograničava pristup privatnih članova izvan klase.
Slično tome, zaštićenim članovima mogu pristupiti samo izvedene klase i oni su nedostupni izvana. Na primjer,
class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )
Međutim, na C ++-u postoji značajka koja se naziva funkcije prijatelja koja krši ovo pravilo i omogućuje nam pristup funkcijama članova izvan klase.
Slično tome, postoji i razred prijatelja , koji ćemo naučiti kasnije u ovom vodiču.
prijatelj Funkcija u C ++
Prijatelj funkcija može pristupiti privatnim i zaštićene podatke klase. Deklariramo funkciju prijatelja pomoću friend
ključne riječi unutar tijela klase.
class className (… friend returnType functionName(arguments);… )
Primjer 1: Rad 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; )
Izlaz
Udaljenost: 5
Ovdje addFive()
je funkcija prijatelja koja može pristupiti i privatnim i javnim članovima podataka.
Iako nam ovaj primjer daje ideju o konceptu funkcije prijatelja, ne pokazuje smislenu upotrebu.
Značajnija uporaba bila bi operacija na objektima dviju različitih klasa. Tada funkcija prijatelja može biti od velike pomoći.
Primjer 2: Dodajte članove dva različita razreda
// 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; )
Izlaz
Zbroj: 13
U ovom programu ClassA
i ClassB
deklarirali ste add()
kao funkciju prijatelja. Dakle, ova funkcija može pristupiti privatnim podacima obje klase.
Ovdje treba primijetiti da funkcija prijatelja unutar ClassA
koristi ClassB
. Međutim, ClassB
u ovom trenutku nismo definirali .
// inside classA friend int add(ClassA, ClassB);
Da bi ovo uspjelo, potrebna nam je prethodna izjava o ClassB
našem programu.
// forward declaration class ClassB;
prijatelj Razred na C ++
Također možemo koristiti klasu prijatelja na C ++ pomoću friend
ključne riječi. Na primjer,
class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )
Kad se klasa proglasi za razred prijatelja, sve funkcije člana klase prijatelja postaju funkcije prijatelja.
Budući da classB
je razred prijatelja, svim članovima korisnika možemo pristupiti classA
iznutra classB
.
Međutim, ne možemo pristupiti članovima ClassB
iznutra classA
. To je zato što se odnos prijatelja u C ++-u samo odobrava, a ne uzima.
Primjer 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; )
Izlaz
Zbroj: 13
Evo, ClassB
razred prijatelja je ClassA
. Dakle, ClassB
ima pristup članovima classA
.
U ClassB
, stvorili smo funkciju add()
koja vraća zbroj numA i numB.
Budući da ClassB
je razred prijatelja, možemo stvarati predmete ClassA
iznutra ClassB
.