În acest tutorial, vom învăța să creăm funcții de prieten și clase de prieteni în C ++ cu ajutorul unor exemple.
Ascunderea datelor este un concept fundamental al programării orientate pe obiecte. Restricționează accesul membrilor privați din afara clasei.
În mod similar, membrii protejați pot fi accesați numai de clase derivate și sunt inaccesibili din exterior. De exemplu,
class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )
Cu toate acestea, există o caracteristică în C ++ numită funcții de prieten care încalcă această regulă și ne permite să accesăm funcțiile de membru din afara clasei.
În mod similar, există și o clasă de prieteni , pe care o vom învăța mai târziu în acest tutorial.
Funcția prieten în C ++
O funcție de prieten poate accesa datele private și protejate ale unei clase. Declarăm o funcție prieten folosind friend
cuvântul cheie din corpul clasei.
class className (… friend returnType functionName(arguments);… )
Exemplul 1: Funcționarea unui prieten
// 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; )
Ieșire
Distanță: 5
Aici addFive()
este o funcție de prietenie care poate accesa atât membrii de date private, cât și cei publici .
Deși acest exemplu ne oferă o idee despre conceptul de funcție de prieten, acesta nu arată nicio utilizare semnificativă.
O utilizare mai semnificativă ar fi operarea pe obiecte din două clase diferite. Atunci funcția prieten poate fi de mare ajutor.
Exemplul 2: Adăugați membri ai a două clase diferite
// 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; )
Ieșire
Suma: 13
În acest program, ClassA
și ClassB
au declarat add()
ca funcție prieten. Astfel, această funcție poate accesa datele private ale ambelor clase.
Un lucru de remarcat aici este că funcția de prieten din interior ClassA
este utilizarea ClassB
. Cu toate acestea, nu am definit ClassB
în acest moment.
// inside classA friend int add(ClassA, ClassB);
Pentru ca acest lucru să funcționeze, avem nevoie de o declarație ulterioară a ClassB
programului nostru.
// forward declaration class ClassB;
prieten Clasa în C ++
De asemenea, putem folosi o clasă de prieteni în C ++ folosind friend
cuvântul cheie. De exemplu,
class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )
Când o clasă este declarată clasă de prieten, toate funcțiile membre ale clasei de prieteni devin funcții de prietenie.
Deoarece classB
este o clasă de prieteni, putem accesa toți membrii classA
din interior classB
.
Cu toate acestea, nu putem accesa membrii ClassB
din interior classA
. Acest lucru se datorează faptului că relația de prietenie în C ++ este doar acordată, nu luată.
Exemplul 3: Clasa prieten 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; )
Ieșire
Suma: 13
Iată ClassB
o clasă de prieteni ClassA
. Deci, ClassB
are acces la membrii classA
.
În ClassB
, am creat o funcție add()
care returnează suma numA și numB.
Deoarece ClassB
este o clasă de prieteni, putem crea obiecte din ClassA
interiorul ClassB
.