Š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 friend
raktinį ž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 ClassA
ir ClassB
deklaravote 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, ClassA
naudojant 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 ClassB
mūsų programoje.
// forward declaration class ClassB;
draugo klasė C ++
Mes taip pat galime naudoti draugų klasę C ++, naudodami friend
raktinį ž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 classB
tai yra draugų klasė, mes galime pasiekti visus narius classA
iš vidaus classB
.
Tačiau mes negalime prieiti prie narių ClassB
iš 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 ClassB
yra draugų klasė ClassA
. Taigi, ClassB
turi prieigą prie classA
.
Be ClassB
, mes sukūrėme funkciją add()
, kad grąžina Numa ir nutirpęs suma.
Kadangi ClassB
tai yra draugų klasė, mes galime sukurti objektus ClassA
viduje ClassB
.