Ystäväominaisuus, käytetäänkö funktiota tai luokkaa, voi aiheuttaa kielteisen vaikutuksen objektikeskeiseen kehykseen, koska se heikentää kapselointia, joka on objektikohtaisen paradigman vastainen. Tästä syystä ystävätoimintoa on käytettävä viisaasti, muuten se voi rikkoa koodin piilottamisen .
Tämä ystäväominaisuus ei ole kommutatiivinen eikä transitiivinen . X on Y: n ystävä, joka ei osoita, että Y on myös X: n ystävä. Jos X on Y: n ystävä ja Y on Z: n ystävä, ei vaikuta siihen, että X on Z: n ystävä.
Vertailukaavio
Vertailun perusteet | Ystävätoiminto | Ystäväluokka |
---|---|---|
perustiedot | Se on funktio, jota käytetään ystäväsi avainsanan kanssa, jotta luokkaan kuulumattomat yksityiset jäsenet pääsevät käyttämään ulkopuolista toimintoa. | Se on luokka, jota käytetään yhdessä ystäväsi avainsanan kanssa toisen luokan yksityisten jäsenten käyttämiseen. |
Välitysilmoitus | On käytettävä. | Ei pakollinen. |
Käyttää | Ystävätoimintoa voidaan käyttää joissakin tilanteissa, joissa operaattori on ylikuormitettu. | Ystäväryhmää voidaan käyttää, kun luokka luodaan toisen luokan päälle. |
Ystävätoiminnon määritelmä
Ystävätoimintoa käytetään pääsemään luokan yksityisiin ja suojattuihin jäseniin sallimalla ei-jäsenfunktiolla pääsy. Tämäntyyppisessä toiminnassa käytetään ystäväsi avainsanaa ennen funktion nimeä ilmoituksen tekohetkellä. Ystävätoiminnossa on joitakin rajoituksia. Ensimmäinen edellytys on, että ystävätoimintoa ei peri lapsiluokka. Toinen ehto on, että tallennusluokan määrittäjä ei välttämättä ole läsnä ystävätoiminnossa, mikä tarkoittaa, että sitä ei voida julistaa staattiseksi ja ulkoiseksi.
Ystävätoimintoa ei kutsuta luokan kutsuvalla esineellä. Ystävätoiminnon esimerkkejä ovat: globaali toiminto, luokan jäsenfunktio, funktiomalli voi olla ystävätoiminto. Ymmärrämme sen esimerkin avulla.
# sisällytetään käyttämällä nimiavaruutta std; luokan ensimmäinen {int data; julkinen: ensimmäinen (int i): data (i) {} ystävä tyhjä näyttö (const first & a); }; tyhjä näyttö (const first & a) {cout << "data =" <Ystäväryhmän määritelmä
Samoin kuin ystävätoiminto, voimme tehdä yhden luokan olevan toisen luokan ystävä, jota kutsutaan ystäväluokaksi . Niin, että ystäväluokka pääsee pääsemään toisen luokan sisällä määriteltyihin yksityisiin jäseniin. On tärkeää muistaa, että ystäväluokka voi käyttää vain muita luokkiin määriteltyjä nimiä sen sijaan, että he olisivat perineet toisen luokan. Ensimmäisen luokan jäsenet eivät voi tulla ystäväluokan jäseniksi. Näitä ystäväluokkia käytetään harvoin.
Ystäväluokka voidaan ilmoittaa useammassa kuin yhdessä luokassa. Sitä pidetään lyhyenä vaihtoehtoisena menetelmänä ystävätoiminnolle, koska tämän avulla voimme luoda ystäväluokan, joka voi käyttää koko datan jäsentä ja toimintoa useiden ystävätoimintojen luomisen sijaan.
# sisällytetään käyttämällä nimiavaruutta std; class First {// Ilmoita ystäväryhmän ystäväluokka Toinen; julkinen: Ensimmäinen (): a (0) {} void print () {cout << "Tulos on" << a << endl; } yksityinen: int a; }; class Second {public: void change (Ensimmäinen & yclass, int x) {yclass.a = x; }}; int main () // Lähtö Tulos on 0 Tulos on 5Ystävätoiminnon ja ystäväluokan keskeiset erot
- Ystävätoiminto on toiminto, joka voi käyttää luokan yksityisiä ja suojattuja jäseniä. Sitä vastoin ystäväluokka on luokka, joka auttaa pääsemään luokan yksityisiin jäseniin.
- Ystävätoiminto julistetaan sisällyttämällä sen prototyyppi luokan sisällä, antamalla se avainsanaystävälle. Samoin ystäväluokka määritellään myös avainsanaystävän avulla.
- Ennakkoilmoitusta käytetään ystävätoiminnon yhteydessä, eikä sitä tarvitse käyttää ystäväryhmässä.
johtopäätös
Ystävätoimintoa tarvitaan, kun funktion täytyy käyttää kahta tai useampaa itsenäistä luokkaa, sisäisiä jäseniä. Toisaalta tarvitaan ystäväluokka, kun luokka vaatii pääsyn toisen luokan jäseniin. Kun usean jäsenen funktion täytyy olla kyseisen toiminnon ystävä, siinä tapauksessa on parempi käyttää ystäväryhmää.