Draugu funkcija, ko izmanto funkcija vai klase, var negatīvi ietekmēt objektu orientētu sistēmu, jo tā vājina iekapsulēšanu, kas ir pret objektu orientētu paradigmu. Tas ir iemesls, kāpēc drauga funkcija ir jāizmanto saprātīgi, citādi tā var izjaukt koda slēpšanu .
Šī drauga funkcija nav ne komutatīva, ne transitīva . X ir Y draugs, nenosaka, ka Y ir arī X draugs. Ja X ir Y draugs un Y ir Z draugs, tas nenozīmē, ka X ir Z. draugs.
Salīdzinājuma diagramma
Salīdzināšanas pamats | Drauga funkcija | Draugu klase |
---|---|---|
Pamata | Tā ir funkcija, kas tiek izmantota kopā ar drauga atslēgvārdu, lai piešķirtu grupai nepiederošu funkciju piekļūt klases privātiem dalībniekiem. | Tā ir klase, ko izmanto kopā ar drauga atslēgvārdu, lai piekļūtu citas klases privātajiem dalībniekiem. |
Pārsūtīt deklarāciju | Jāizmanto. | Nav obligāta. |
Izmantot | Draugu funkcija var tikt izmantota dažās operatora pārslodzes situācijās. | Draugu klasi var izmantot, ja klasi izveido citas klases virsotnē. |
Drauga funkcijas definīcija
Draugu funkcija tiek izmantota, lai piekļūtu klases privātajiem un aizsargātajiem dalībniekiem, ļaujot nepiederošajai funkcijai piekļūt. Šāda veida funkcijā drauga atslēgvārds tiek izmantots pirms funkcijas nosaukuma deklarācijas brīdī. Draugu funkcijai ir daži ierobežojoši nosacījumi. Pirmais nosacījums ir tas, ka drauga funkcija nav mantojama bērna klasei. Otrs nosacījums ir tas, ka uzglabāšanas klases specifikācija var nebūt pieejama drauga funkcijā, kas nozīmē, ka to nevar deklarēt kā statisku un ārēju.
Draugu funkcija netiek izsaukta ar klases priekšmetu. Draugu funkcijas piemēri ir: globāla funkcija, klases funkcijas funkcija, funkciju veidne var būt drauga funkcija. Sapratīsim to ar piemēru.
#include izmantojot namespace std; pirmās klases {int data; publiski: pirmais (int i): dati (i) {} drauga tukšais displejs (const first & a); }; tukšs displejs (const first & a) {cout << "data =" <Draugu klases definīcija
Līdzīgi kā drauga funkcijai, mēs varam padarīt vienu klasi par citas klases draugu, ko sauc par draugu klasi . Lai draugu klase varētu piekļūt privātiem dalībniekiem, kas definēti otrajā klasē. Ir svarīgi atcerēties, ka draugu klase var piekļūt tikai tiem nosaukumiem, kas definēti otrajā klasē, nevis mantot citu klasi. Tieši pirmās klases locekļi nevar kļūt par draugu klases biedriem. Šīs draugu klases tiek reti izmantotas.
Draugu klasi var deklarēt vairāk nekā vienā klasē. Tā tiek uzskatīta par īsu alternatīvu metodi drauga funkcijai, jo ar tās palīdzību mēs varam izveidot draugu klasi, kas var piekļūt visiem datu biedriem un funkcijai, nevis izveidot vairākas draugu funkcijas.
#include izmantojot namespace std; klase Pirmā {// Atzīst drauga klases draugu klasi Otrā; public: First (): a (0) {} void print () {cout << "Rezultāts ir" << a << endl; } privāti: int a; }; class Second {public: void change (pirmais & yclass, int x) {yclass.a = x; }}; int main () // Rezultāts Rezultāts ir 0 Rezultāts ir 5Galvenās atšķirības starp drauga funkciju un draugu klasi
- Drauga funkcija ir funkcija, kas var piekļūt privātiem un aizsargātiem klases dalībniekiem. Savukārt draugu klase ir klase, kas palīdz piekļūt klases privātajiem dalībniekiem.
- Draugu funkcija tiek deklarēta, iekļaujot tās prototipu klasē, pirms tam to norādot ar atslēgvārdu draugu. Tāpat arī draugu klase ir definēta, izmantojot atslēgvārdu draugu.
- Nosūtīšanas deklarācija tiek izmantota, ja draugs darbojas pretēji, nav nepieciešams to izmantot draugu klasē.
Secinājums
Nepieciešama drauga funkcija, ja funkcijai nepieciešams piekļūt divām vai vairākām neatkarīgām klasēm, iekšējiem dalībniekiem. No otras puses, ir nepieciešama draugu klase, ja klasei ir nepieciešama piekļuve citas klases biedriem. Ja vairāku dalībnieku funkcijai ir jābūt šīs funkcijas draugam, šajā gadījumā labāk ir izmantot draugu klasi.