Šajā apmācībā mēs iemācīsimies izveidot draugu funkcijas un draugu nodarbības C ++ ar piemēru palīdzību.
Datu slēpšana ir objektorientētas programmēšanas pamatjēdziens. Tas ierobežo privātu locekļu piekļuvi ārpus klases.
Tāpat aizsargātiem dalībniekiem var piekļūt tikai atvasinātas klases, un tie nav pieejami no ārpuses. Piemēram,
class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )
Tomēr C ++ ir funkcija, ko sauc par drauga funkcijām, kas pārkāpj šo noteikumu un ļauj mums piekļūt dalībnieku funkcijām ārpus klases.
Līdzīgi ir arī draugu klase , kuru mēs uzzināsim vēlāk šajā apmācībā.
drauga funkcija C ++
Draugs funkcija var piekļūt privātos un aizsargātus datus klasi. Mēs paziņojam par drauga funkciju, izmantojot friend
atslēgas vārdu klases ķermenī.
class className (… friend returnType functionName(arguments);… )
1. piemērs: Drauga funkcijas darbība
// 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; )
Rezultāts
Attālums: 5
Šeit addFive()
ir drauga funkcija, kas var piekļūt gan privāto, gan publisko datu dalībniekiem.
Lai gan šis piemērs dod mums priekšstatu par drauga funkcijas jēdzienu, tas neliecina par jēgpilnu lietojumu.
Jēdzīgāk izmantotu divu dažādu klašu objektus. Tieši tad drauga funkcija var būt ļoti noderīga.
2. piemērs: pievienojiet divu dažādu klašu locekļus
// 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; )
Rezultāts
Summa: 13
Šajā programmā, ClassA
un ClassB
ir deklarēti add()
kā draugs funkciju. Tādējādi šī funkcija var piekļūt abu klašu privātajiem datiem.
Viena lieta, ko šeit pamanīt, ir drauga funkcija iekšpusē, ClassA
izmantojot ClassB
. Tomēr mēs ClassB
šajā brīdī neesam definējuši .
// inside classA friend int add(ClassA, ClassB);
Lai tas darbotos, ClassB
mūsu programmā ir nepieciešama iepriekšēja deklarācija .
// forward declaration class ClassB;
draugu klase C ++
Izmantojot friend
atslēgvārdu, mēs varam izmantot arī draugu klasi C ++ . Piemēram,
class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )
Kad klase tiek pasludināta par draugu klasi, visas draugu klases dalībnieku funkcijas kļūst par drauga funkcijām.
Tā kā classB
tā ir draugu klase, mēs varam piekļūt visiem dalībniekiem classA
no iekšpuses classB
.
Tomēr mēs nevaram piekļūt dalībniekiem ClassB
no iekšpuses classA
. Tas ir tāpēc, ka draugu attiecības C ++ tiek piešķirtas tikai, nevis ņemtas.
3. piemērs: C ++ draugu klase
// 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; )
Rezultāts
Summa: 13
Šeit ClassB
ir draugu klase ClassA
. Tātad, ClassB
ir piekļuve classA
.
Gadā ClassB
mēs esam izveidojuši funkciju, add()
kas atgriež skaitļu un numB summu.
Tā kā ClassB
tā ir draugu klase, mēs varam izveidot objektus ClassA
iekšpusē ClassB
.