Funcții și cursuri de prietenie C ++ (cu exemple)

Î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 friendcuvâ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 ClassBau 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 ClassAeste 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 ClassBprogramului nostru.

 // forward declaration class ClassB;

prieten Clasa în C ++

De asemenea, putem folosi o clasă de prieteni în C ++ folosind friendcuvâ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 classBeste o clasă de prieteni, putem accesa toți membrii classAdin interior classB.

Cu toate acestea, nu putem accesa membrii ClassBdin 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ă ClassBo clasă de prieteni ClassA. Deci, ClassBare acces la membrii classA.

În ClassB, am creat o funcție add()care returnează suma numA și numB.

Deoarece ClassBeste o clasă de prieteni, putem crea obiecte din ClassAinteriorul ClassB.

Articole interesante...