Sõberfunktsioon, kas seda funktsiooni või klassi kasutavad, võib avaldada objektiivile orienteeritud raamistikule negatiivset mõju, kuna see nõrgendab kapseldamist, mis on objekti-orienteeritud paradigma vastu. See on põhjus, miks sõbra funktsiooni tuleb kasutada targalt, vastasel juhul võib see koodi koodi peitmise katkestada .
See sõbra funktsioon ei ole kommutatiivne ega transitiivne . X on Y sõber, ei järelda, et Y on ka X sõber. Kui X on Yi sõber ja Y on Z sõber, ei tähenda see, et X on Z. sõber.
Võrdluskaart
Võrdluse alus | Sõbra funktsioon | Sõbraklass |
---|---|---|
Põhiline | See on funktsioon, mida kasutatakse koos sõbra märksõnaga, et anda mitteliikmetele funktsioon juurdepääsu klassi isiklikele liikmetele. | See on klass, mida kasutatakse koos sõbra märksõnaga teise klassi privaatsete liikmete juurde pääsemiseks. |
Edasta deklaratsioon | Tuleb kasutada. | Ei ole kohustuslik. |
Kasutage | Sõberfunktsiooni saab kasutada teatud olukorras, kus operaator on ülekoormatud. | Sõbraklassi saab kasutada, kui klass luuakse teise klassi tippu. |
Sõbra funktsiooni määratlus
Sõberfunktsiooni kasutatakse klassi era- ja kaitstud liikmetele juurdepääsu võimaldamiseks, võimaldades mitteliikmetele juurdepääsu. Seda tüüpi funktsioonis kasutatakse sõbra märksõna enne funktsiooni nime deklaratsiooni esitamise ajal. Sõberfunktsiooni suhtes kehtivad mõned piiravad tingimused. Esimene tingimus on, et sõberfunktsioon ei ole päritud lasteklassi poolt. Teine tingimus on see, et ladustamisklassi täpsustaja ei pruugi olla sõberfunktsioonis, mis tähendab, et seda ei saa deklareerida staatiliseks ja väliseks.
Sõberfunktsiooni ei kutsuta klassi kutsuva objektiga. Sõberfunktsiooni näited on: globaalne funktsioon, klassi liikmefunktsioon, funktsiooni mall võib olla sõberfunktsioon. Mõistame seda näite abil.
#kasuta nimeruumi std; esimese klassi {int andmed; avalik: esimene (int i): andmed (i) {} sõber tühine ekraan (const first & a); }; tühi kuva (const first & a) {cout << "data =" <Sõbraklassi mõiste
Sarnaselt sõberfunktsiooniga saame ühe klassi olla teise klassi sõber, keda nimetatakse sõbraklassiks . Nii, et sõberklass saab juurdepääsu teistesse klassidesse määratud eraklientidele. Oluline on meeles pidada, et sõberklass saab kasutada ainult teise klassi sees asuvaid nimesid selle asemel, et pärida teist klassi. Täpselt, esimese klassi liikmed ei saa sõberklassi liikmeteks. Neid sõprusklasse kasutatakse harva.
Sõbraklassi saab deklareerida rohkem kui ühes klassis. Seda peetakse lühikeseks alternatiivseks meetodiks sõberfunktsiooni jaoks, sest selle abil saame luua sõbraklassi, mis suudab mitme sõbra funktsiooni loomise asemel pääseda juurde kogu andmeliikmele ja funktsioonile.
#kasuta nimeruumi std; klass Esimene {// Kuuluta sõbraklassi sõber klassi Teine; avalik: Esiteks (): a (0) {} void print () {cout << "Tulemuseks on" << a << endl; } private: int a; }; klass Teine {public: void change (esimene & yclass, int x) {yclass.a = x; }}; int main () // Väljund Tulemuseks on 0 Tulemuseks on 5Sõberfunktsiooni ja sõbra klassi vahelised peamised erinevused
- Sõbra funktsioon on funktsioon, mis võimaldab ligipääsu klassi era- ja kaitstud liikmetele. Samas on sõbraklass klass, mis aitab ligipääsu klassi isiklikele liikmetele.
- Sõbra funktsioon on deklareeritud, lisades selle prototüübi klassi sees, andes selle märksõnaga sõbraks. Sarnaselt on sõbra klass määratletud ka märksõna sõbra abil.
- Edastusdeklaratsiooni kasutatakse sõberfunktsioonide korral, seda ei ole vaja kasutada sõbraklassis.
Järeldus
Sõbra funktsioon on vajalik, kui funktsioonil on juurdepääs kahele või enamale iseseisvale klassile, sisemisele liikmele. Teisest küljest, kui klass vajab juurdepääsu teise klassi liikmetele, on vaja sõberklassi. Kui mitme liikme funktsioon peab olema selle funktsiooni sõber, on sel juhul parem kasutada sõbraklassi.