IT-friendly caracteristici diamante

Funcția de clasă prietenos este o funcție care nu este o componentă a acesteia, are acces la propria sa (privat) și componente protejate (protejate). Funcția nu poate fi un prieten la o clasă „fără consimțământul său.“ Pentru obținerea drepturilor altor funcții care urmează să fie descrise în corpul clasei cu prietenul specificator. Este prezența unei astfel de descriere a clasei asigură funcția legii accesului la componentele protejate și private.

Unele caracteristici caracteristici prietenoase.

caracteristici prietenoase în apelul nu obține acest indicator.

clasa de obiecte trebuie să fie transmise numai caracteristici aparent prietenoase prin setările dispozitivului.

Funcții prieten nu pot fi invocate prin obiectul de clasă, ei sunt prieteni, precum și prin pointerii la aceste obiecte. Cu alte cuvinte, următoarele acțiuni sunt interzise:

Funcția prietenoasă care nu sunt acoperite de specificatorul de acces (public, protejat, privat), astfel încât plasarea funcției prietenos prototip în interiorul definiției de clasă este indiferentă.

caracteristică prietenos nu poate fi o funcție componentă a clasei în raport cu care este definit ca un prietenos, dar poate fi pur și simplu o funcție la nivel mondial, precum și funcția de o altă componentă a unei clase definite anterior.

Funcția prietenos poate fi prietenos cu mai multe clase.

Ceva despre aplicație

Folosind mecanismul de caracteristici prietenoase pentru a simplifica interfața dintre clase. De exemplu, o funcție de prieten va oferi acces la componente private sau securizate de mai multe clase. Astfel, clasele pot elimina uneori caracteristicile de componente proiectate numai pentru accesul la aceste componente „ascunse“.

Ca un exemplu, ia în considerare funcția de cele două clase prietene „punct de pe plan“ și „linia dreaptă în avion.“

Clasa „punct pe un plan“ include date componente pentru specificarea coordonatele (x, y) de punct.

Componenta de date de clasă "linie pe planul" sunt coeficienții A, B, C drept ecuația generală A * x + B * y + C = 0.

Funcția prietenos determină abaterea de la punctul de setare al liniei de date. În cazul în care (a, b) - coordonatele unui anumit punct, pentru a alinia, în ecuația care include coeficienți A, B, C, este calculat ca valoarea deviație a expresiei A * A + B * b + C.

Programul descris mai jos clase definite cu o funcție generală prietenoasă în programul principal a introdus obiecte ale acestor clase și abaterea calculată din punct la o linie:

Peregruzka.Itak prietenos, ne-am uitat la funcțiile prietenoase și câteva exemple de aplicare a acestora. Cu toate acestea, una dintre proprietățile de bază ale acestor funcții speciale este faptul că acestea pot fi folosite pentru a pune în aplicare Reacoperirea. Acest tip de suprasarcină se numește prietenos.

Să ne ilustrează caracteristicile de înregistrare a funcțiilor de operare ca o clasă caracteristici prietenoase.

#include using namespace std;

clasa pune în aplicare pentru a lucra cu Boolean pavilion clasa

Determinarea funcției de operare prietenos. (Acest lucru nu este transmis, astfel încât 1 parametru) Flag Operatorul! (pavilion f) valoarea de înlocuire a opus

Rezultatul programului:

suprasarcină la nivel mondial. În C ++, dar două soiuri celebru de suprasarcină (suprasarcină în clasă și de suprasarcină prietenos), există un alt concept - o transbordare globală efectuată într-un domeniu de aplicare exterior.

Să presupunem că a și b sunt declarate ca fiind în clasa C. Obiectele din clasa C este definit operatorul C :: operatorul + (C), prin urmare,

a + b este a.operator + (b)

Cu toate acestea, este de asemenea posibilă supraîncărcare globală operatorul +:

O astfel de variantă de suprasarcină se aplică și la expresia a + b, unde a și b sunt transmise, respectiv, în prima și a doua funcție de parametri. Dintre aceste două forme preferate se consideră o supraîncărcare în sala de clasă. T. k. A doua formă necesită un apel deschis către membrii clasei, iar acest lucru are un impact negativ asupra esteticii încapsulare strictă. A doua formă poate fi mai convenabil să se adapteze clasele care sunt în bibliotecă, în cazul în care codul sursă nu poate fi modificată și perekompilirovat.To trebuie să adăugați la suprasolicitării clasă ca metodă de clasă este nerealistă.

Se amestecă aceste două forme ale programului nu este recomandată. În cazul în care un operator a identificat două forme de aceleași tipuri de parametri formali, apoi utilizați operatorul poate crea ambiguitate care poate dovedi fatală.

Cu toate acestea, Reacoperirea global prevede simetrie, care are, de asemenea, o valoare estetică. Luați în considerare acest exemplu:

#include using namespace std;

coordonează clasa „punct“ de clasă Punctul punctului

suprasarcini globală pentru int acces + punct la privat membri prin funcții speciale Pointoperator + (int d, PointZ)

Fără o int sarcină globală de suprasarcină + punct nu este rezolvată. Din moment ce nu putem avea acces la „nativ“ tip întreg (adică, la un int) și suprascrie operațiunile sale, pentru a asigura simetria definiție simplă clasă nu poate fi operatorii. Aceasta va lua o decizie cu funcții la nivel mondial.

Notă: Am putea folosi o congestie prietenos, și, astfel, a scăpa de „funcții pentru a avea acces privat membri.“ Cu toate acestea, în cazul în care organismul de clasă punct ar fi închis pentru noi, scrie la ea, o altă funcție ar fi nerealistă. datele de intrare / ieșire de suprasarcină. Pentru a consolida noile informații obținute prin congestia, ia în considerare posibilitatea de a supraîncărca operatorii „și“. În primul rând, un pic de informații -

Efectuarea orice program C ++ începe cu un set de fluxuri predefinite, care sunt deschise, declarate ca obiecte de clasă în biblioteca iostream-fișier. Printre ele există două obiecte utilizate în mod obișnuit de către noi - este cin și cout.

cin - istream obiect de clasă (clasa streaming de intrare de uz general, care este clasa de bază pentru alte fluxuri de intrare)

ostream obiect de clasă (clasa Streaming pentru o ieșire de uz general, care este clasa de bază pentru alte fluxuri de ieșire) - cout

Producția în flux se realizează printr-o operație care este supraîncărcat lăsat operațiune de schimbare“. Este operand stânga obiect flux de ieșire. Operandul din dreapta poate fi orice variabilă, pentru care ieșirea este definită în flux. De exemplu, declarația cout « "Bună ziua \ n!"; Aceasta conduce la concluzia într-un flux de Cout predeterminat „Bună ziua!“ Linie.

Pentru informații de intrare din fluxul folosind operații de extracție a, care este operațiunea de deplasare dreapta este supraîncărcat. " Operandul din stânga a operațiunii „este obiectul istream.

Pentru a evita surprize, IO pentru tipurile abstracte de date ar trebui să urmeze aceleași convenții care sunt utilizate de operațiunile de intrare și de ieșire pentru încorporat tipuri, și anume:

3. Pentru a permite accesul la datele private ale operațiunilor de clasă, de intrare și de ieșire să fie anunțat ca o clasă caracteristici prietenoase.

4. În operațiunea de ieșire trebuie să fie transmise la o clasă de obiecte de referință constantă, pentru că această operație este de a modifica obiectele afisate.

Astfel, considerăm un exemplu de astfel de suprasarcină:

Într-un exemplu, am folosit metoda constantă - o metodă care nu are dreptul de a schimba clasa câmpului. Cu toate acestea, în cazul în care unele câmp este declarat cu specificatorul mutabil, valoarea sa poate fi modificată în metoda de tip const.Druzhestvennaya peregruzka.Itak, ne-am uitat la funcțiile prietenoase și câteva exemple de aplicare a acestora. Cu toate acestea, una dintre proprietățile de bază ale acestor funcții speciale este faptul că acestea pot fi folosite pentru a pune în aplicare Reacoperirea. Acest tip de suprasarcină se numește prietenos.

Să ne ilustrează caracteristicile de înregistrare a funcțiilor de operare ca o clasă caracteristici prietenoase.

Rezultatul programului:

În C ++, dar două soiuri celebru de suprasarcină (suprasarcină în clasă și de suprasarcină prietenos), există un alt concept - o transbordare globală efectuată într-un domeniu de aplicare exterior.

suprasarcină globală - suprasarcină este obiectul, nu metoda, operatorul.

Să presupunem că a și b sunt declarate ca fiind în clasa C. Obiectele din clasa C este definit operatorul C :: operatorul + (C), prin urmare,

Cu toate acestea, este de asemenea posibilă supraîncărcare globală operatorul +:

O astfel de variantă de suprasarcină se aplică și la expresia a + b, unde a și b sunt transmise, respectiv, în prima și a doua funcție de parametri. Dintre aceste două forme preferate se consideră o supraîncărcare în sala de clasă. T. k. A doua formă necesită un apel deschis către membrii clasei, iar acest lucru are un impact negativ asupra esteticii încapsulare strictă. A doua formă poate fi mai convenabil să se adapteze clasele care sunt în bibliotecă, în cazul în care codul sursă nu poate fi modificată și perekompilirovat.To trebuie să adăugați la suprasolicitării clasă ca metodă de clasă este nerealistă.

Se amestecă aceste două forme ale programului nu este recomandată. În cazul în care un operator a identificat două forme de aceleași tipuri de parametri formali, apoi utilizați operatorul poate crea ambiguitate care poate dovedi fatală.

Cu toate acestea, Reacoperirea global prevede simetrie, care are, de asemenea, o valoare estetică. Luați în considerare acest exemplu:

Fără o int sarcină globală de suprasarcină + punct nu este rezolvată. Din moment ce nu putem avea acces la „nativ“ tip întreg (adică, la un int) și suprascrie operațiunile sale, pentru a asigura simetria definiție simplă clasă nu poate fi operatorii. Aceasta va lua o decizie cu funcții la nivel mondial.

Am putea folosi o congestie prietenos, și, astfel, a scăpa de „funcții pentru a avea acces privat membri.“ Cu toate acestea, în cazul în care organismul de clasă punct ar fi închis pentru noi, scrie la ea, o altă funcție ar fi nerealistă.

Pentru a consolida noile informații obținute prin congestia, ia în considerare posibilitatea de a supraîncărca operatorii „și“. În primul rând, un pic de informații - Efectuați orice program C ++ începe cu un set de fluxuri predefinite, care sunt deschise, declarate ca obiecte de clasă în biblioteca iostream-fișier. Printre ele există două obiecte utilizate în mod obișnuit de către noi - este cin și cout.

cin - istream obiect de clasă (clasa streaming de intrare de uz general, care este clasa de bază pentru alte fluxuri de intrare) cout - obiect de clasă ostream (clasa de streaming pentru o ieșire de uz general, care este clasa de bază pentru alte fluxuri de ieșire)

Producția în flux se realizează printr-o operație care este supraîncărcat lăsat operațiune de schimbare“. Este operand stânga obiect flux de ieșire. Operandul din dreapta poate fi orice variabilă, pentru care ieșirea este definită în flux. De exemplu, declarația cout « "Bună ziua \ n!"; Aceasta conduce la concluzia într-un flux de Cout predeterminat „Bună ziua!“ Linie.

Pentru informații de intrare din fluxul folosind operații de extracție a, care este operațiunea de deplasare dreapta este supraîncărcat. " Operandul din stânga a operațiunii „este obiectul istream.

Pentru a evita surprize, IO pentru tipurile abstracte de date ar trebui să urmeze aceleași convenții care sunt utilizate de operațiunile de intrare și de ieșire pentru încorporat tipuri, și anume:

Pentru a permite accesul la datele private ale operațiunilor de clasă, de intrare și de ieșire să fie anunțat ca o clasă caracteristici prietenoase.

Operația de ieșire este necesară pentru a transmite o referință constantă la obiectul de clasă, deoarece această operație nu modifică obiectele de ieșire.

Astfel, considerăm un exemplu de astfel de suprasarcină:

Într-un exemplu, am folosit metoda constantă - o metodă care nu are dreptul de a schimba clasa câmpului. Cu toate acestea, în cazul în care unele câmp este declarat cu specificatorul mutabil, valoarea sa poate fi modificată în metoda de tip const.

Este timpul pentru a afla ce „prieteni“ poate nu numai funcția. Clasa poate fi, de asemenea, prietenos la o altă clasă.

Caracteristici ale „prieteniei“ între clase.

clasa Prietenos trebuie să fie definite în afara corpului de clasă „oferind prietenii“.

Toate clasa componente, alte caracteristici vor fi prietenos la o altă clasă, fără prieten specificator.

Toate componentele din clasa disponibile în clasa, prietenos, dar nu invers.

Clasa prietenoasă poate fi definit mai târziu (mai mic) decât cel descris prietenos.