Funcții și clase prietenoase

CharToOem ("zona triunghiului", S);

În exemplul de mai sus, se declară clasa punctului Dot și se rezolvă problema calculării distanței dintre două puncte. Problema este rezolvată în trei moduri diferite.







Funcția doubledot. Dist (Dot B) const este un membru al clasei Dot și returnează valoarea distanței dintre punctele curente și cele specificate. Specificatorul const indică compilatorului că nu trebuie schimbată starea obiectului curent. Ca parametru, funcția primește un întreg obiect de tip Dot. care ocupă în memorie 17 octeți. Funcția de membru al clasei este apelată de operator: A.Dist (B), unde obiectul A este curent și obiectul B este un parametru.

Prietenul funcției doubleDist (constDot A. constDot B) returnează distanța dintre două puncte specificate. Calificatorul const înaintea parametrilor spune compilatorului că starea parametrilor nu trebuie schimbată. Ca parametri, funcția primește două referințe la obiectele de tip Dot. care ocupă câte 4 octeți fiecare în memorie. Funcția este apelată de operatorul Dist (A. B). Deoarece funcția este o clasă prietenoasă. apoi accesul la elementele închise x și y ale parametrilor A și B care sunt obiecte de tip Dot. se efectuează folosind operatorul punct, de exemplu: A .x.

Utilizarea indicatoarelor și a referințelor de obiecte ca parametri de funcții în loc de obiecte reduce cantitatea de memorie rezervată funcției și timpul în care este apelată.

Exemplul de mai sus conține, de asemenea, o soluție la problema calculării ariei unui triunghi folosind funcția globală doubleArea (constDot A. constDot B. constDot C), care primește trei referințe la puncte și returnează valoarea zonei triunghiului. Funcția este apelată de operatorul Area (A. B. C). Deși funcția utilizează obiecte de tip Dot. Organismul de funcții nu conține apeluri către membri particulari ai clasei. Prin urmare, nu am declarat că funcția este prietenoasă.







Funcții prietenoase pentru mai multe clase

Funcția poate fi prietenoasă pentru mai multe clase simultan. În exemplul de mai jos, este rezolvată problema calculării coordonatelor sfârșitului unui vector dat, a cărei origine este la un anumit punct.

clasa Dot // clasa punct

Vec AC ("AC", 2, 2);

În acest exemplu, clasele punctului Dot și vectorul Vec sunt declarate și problema este rezolvată în trei moduri diferite.

Funcția voidDot. EndVec (constDot A. constVec AB) este membru al clasei Dot. primește referințe constante la vectorul și originea vectorului și transferă coordonatele capătului vectorului la punctul curent. Deoarece membrii privați de date Vec nu sunt disponibili în clasa Dot. atunci folosim funcțiile deschise ale membrilor claselor Vec - GetY () și GetX (). Funcția de membru al clasei este apelată de operator: C.EndVec (A. AC), unde obiectul C este curent, iar obiectele A și AC sunt parametri.

Funcția voidVec. EndVec (constDot A. Dot B) este membru al clasei Vec. primește o referință constantă la începutul vectorului și o referință la sfârșitul vectorului. În calcule se folosesc valorile proiecțiilor vectorului curent. Deoarece membrii privați ai clasei Dot nu sunt disponibili în clasa Vec. atunci folosim funcțiile deschise ale membrilor clasei Dot - GetX (), GetY (), SetX (), SetY (). Funcția de membru al clasei este apelată de operator: AC .EndVec (A.C), unde obiectul AC este curent, iar obiectele A și C sunt parametri.

Prietenul funcției voidEndVec (constDot A. constVec AB. punct B) este o clasă prietenoasă Dot și Vec. Pentru aceasta, este declarat în ambele clase cu cuvântul cheie prieten. Funcția primește referințe constante la începutul vectorului și vectorul, precum și la referința la sfârșitul vectorului. Deoarece membrii de date private din clasele Dot și Vec sunt accesibili unei funcții prietenoase, folosim operatorul punct pentru a accesa aceste date. O funcție prietenoasă este apelată de declarația EndVec (A. AC.C).

Funcțiile membrilor care sunt prietenoase cu o altă clasă

O funcție poate fi un membru al unei clase și una prietenoasă unei alte clase. Pentru a demonstra această tehnică sintactică, vom schimba ușor exemplul anterior.

Apelul funcțiilor date nu diferă de exemplul anterior.

O clasă nu se poate declara prietenă a unei alte clase. Pentru ca mecanismul prietenos să funcționeze, trebuie să fie declarat prietenos în această clasă.

prieten classVec; // Class Vec este declarat prieten cu clasa Dot







Articole similare

Trimiteți-le prietenilor: