„C ++“ draugo funkcijos ir klasės (su pavyzdžiais)

Šioje pamokoje išmoksime kurti draugo funkcijas ir draugų klases C ++ formatu, naudodamiesi pavyzdžiais.

Duomenų slėpimas yra pagrindinė objektinio programavimo koncepcija. Tai riboja privačių narių, esančių ne iš klasės, prieigą.

Panašiai į saugomus narius gali patekti tik išvestinės klasės ir jie yra nepasiekiami iš išorės. Pavyzdžiui,

 class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )

Tačiau C ++ yra funkcija, vadinama draugo funkcijomis, kurios pažeidžia šią taisyklę ir leidžia mums pasiekti narių funkcijas ne iš klasės.

Panašiai yra ir draugų klasė , kurią sužinosime vėliau šioje pamokoje.

draugo funkcija C ++

Draugas funkcija gali naudotis privačios ir saugomi duomenys apie klasę. Mes paskelbiame draugo funkciją, naudodami friendraktinį žodį klasės kūne.

 class className (… friend returnType functionName(arguments);… )

1 pavyzdys: Draugo funkcijos veikimas

 // 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; )

Rezultatas

 Atstumas: 5

Čia addFive()yra draugo funkcija, kuri gali pasiekti tiek privačius, tiek viešuosius duomenų narius.

Nors šis pavyzdys suteikia mums idėją apie draugo funkcijos sampratą, jis nerodo jokio prasmingo naudojimo.

Reikšmingiau būtų naudojami dviejų skirtingų klasių objektai. Tuomet draugo funkcija gali būti labai naudinga.

2 pavyzdys: pridėkite dviejų skirtingų klasių narius

 // 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; )

Rezultatas

 Suma: 13

Šioje programoje ClassAir ClassBdeklaravote add()kaip draugo funkciją. Taigi ši funkcija gali pasiekti privačius abiejų klasių duomenis.

Vienas dalykas, kurį reikia pastebėti, yra viduje esanti draugo funkcija, ClassAnaudojant ClassB. Tačiau šiuo metu mes neapibrėžėme ClassB.

 // inside classA friend int add(ClassA, ClassB);

Kad tai veiktų, mums reikia išankstinės deklaracijos ClassBmūsų programoje.

 // forward declaration class ClassB;

draugo klasė C ++

Mes taip pat galime naudoti draugų klasę C ++, naudodami friendraktinį žodį. Pavyzdžiui,

 class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )

Kai klasė paskelbiama draugo klase, visos draugo klasės narės funkcijos tampa draugo funkcijomis.

Kadangi classBtai yra draugų klasė, mes galime pasiekti visus narius classAiš vidaus classB.

Tačiau mes negalime prieiti prie narių ClassBiš vidaus classA. Taip yra todėl, kad draugo santykiai C ++ yra tik suteikiami, o ne paimami.

3 pavyzdys: C ++ draugo klasė

 // 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; )

Rezultatas

 Suma: 13

Čia ClassByra draugų klasė ClassA. Taigi, ClassBturi prieigą prie classA.

Be ClassB, mes sukūrėme funkciją add(), kad grąžina Numa ir nutirpęs suma.

Kadangi ClassBtai yra draugų klasė, mes galime sukurti objektus ClassAviduje ClassB.

Įdomios straipsniai...