Supraîncărcarea de 49 și operatorii din c

Bună ziua, dragi cititori!

Când am început prin studierea C ++, am avut multe întrebări, care, uneori, nu sunt în măsură să găsească rapid răspunsuri. Nu este o excepție și un astfel de subiect ca Reacoperirea. Acum, că am înțeles în acest subiect, vreau să ajute pe alții să dot i.

Ce este suprasarcina?

Să presupunem că creați clasă sau structura, aceasta va fi descrisă printr-un vector în spațiul 3-dimensional:

Acum, creați 3 obiecte ale acestei structuri:

Și vrei obiect prirovnyat obiect v2 v1, scrie:

Totul funcționează, dar un exemplu de vector este foarte simplificat, poate avea o astfel de structură în care nu trebuie să copiați orbește toate valorile de la un obiect la altul (așa cum este în mod implicit), și să le facă unele manipulare. De exemplu, nu copiați ultima z. În cazul în care programul știe despre asta? Este nevoie de instrucțiuni clare că va efectua.

Prin urmare, trebuie să supraîncărca operatorul de atribuire (=).

Informații generale despre Reacoperirea

Pentru a face acest lucru, vom adăuga în structura noastră de suprasarcină:

Acum, în codul de mai sus, am specificat că repartizarea pe care doriți să copiați variabilele x și y. și z zero.

Dar acest transfer este departe de a fi perfectă, să ne imaginăm că structura noastră nu conține trei variabile de tip int, si multe alte clase de obiecte, în acest caz, această opțiune de suprasarcină va funcționa mai degrabă lent.

  • Primul lucru pe care îl putem face este de a transmite metoda de suprasarcină nu este întregul obiect, și o referire la locul unde este stocat:
Când vom trece obiectul nu este aici. creează, în esență, un obiect nou (din care un exemplar este transmis în metoda), se poate transporta cu ea anumite costuri, atât în ​​timpul programului, iar în memoria ei consumate. - În ceea ce privește obiectele mari.
Trecând un obiect de referință. nu există nici o alocare pentru obiect (să zicem, 128 bytes), iar operația de copiere, memoria este alocat numai pentru un pointer la o celulă de memorie, cu care lucrăm, și este de aproximativ 4 - 8 octeți. Astfel, o lucrare cu un obiect pe linie.
  • Dar dacă vom trece un obiect de referință, devine variabilă. Asta nu este nimic pentru a ne împiedica atunci când operatorul de atribuire (v1 = v2) pentru a schimba nu numai valoarea v1, v2, dar încă!
    exemplu:

    Desigur, aproape nimeni în mintea lor drept nu va produce o astfel de manipulare evidentă. Cu toate acestea, pentru a fi în siguranță, chiar elimina posibilitatea unei astfel de modificări.
    Pentru a face acest lucru, avem nevoie doar pentru a adăuga, chiar înainte de a lua un argument const, deci subliniem că metoda nu poate fi schimbată din interiorul obiectului.

  • Acum, să ne întoarcem privirea spre tipul de întoarcere. Metoda de suprasarcină Vector3 returnează un obiect, adică, un obiect nou, ceea ce poate duce la aceleași probleme pe care le-am descris în primul paragraf. Iar soluția nu este original, nu avem nevoie pentru a crea un nou obiect - asa ca trece o referire la una existentă.

    Dar, atunci când se întorc de referință, pot apărea unele probleme.
    Noi nu scrie această expresie: v1 = (v2 + v3);

    O mică digresiune pe retur:
    Când am studiat suprasarcină, eu nu înțeleg:

    Faptul că toate operațiunile noi trebuie în mod individual și în mod explicit în corpul metodei. Ce înseamnă să scrie: this-> x = v.x etc.
    Dar de ce atunci se întoarcă, să ne întoarcem? De fapt, a reveni în acest exemplu, joacă un rol mai degrabă formal, putem face bine fără ea:

    Și acest cod este destul de o lucrare. pentru că Tot ce trebuie să faceți, indicăm în corpul metodei.
    Dar, în acest caz, nu am ajuns pentru a face o astfel de înregistrare:

    Retreat 2 (nu are nevoie să facă):
    Acum, că știți revenirea operațiune diferența și conduce operațiunea, putem scrie următorul cod:

    Pentru a realiza oroarea definim suprasarcină după cum urmează:

  • Și când supraîncărca operatorul de atribuire, rămâne necesitatea de a elimina alocarea alternativă, în cazurile rare în care, indiferent de motiv, obiectul este atribuit în sine: v1 = v1.
    Pentru a face acest lucru, se adaugă această condiție:

    Diferențele dintre operatorii unari și binare

    Operatorii unari - acestea sunt operatori, care este activat de un singur obiect, la care se aplică toate modificările

    binari - care lucrează cu 2 obiecte

    Supraîncărcarea în corp și corpul clasei

    De ce în supraîncărcarea operatorului funcțiilor prietenoase (prieten)?

    Atunci când nu face fără caracteristici prietenoase în Reacoperirea?

    O eroare apare din următorul motiv, structura Vector2 ne-am supraîncărcat operatorul +, care, ca valoarea dreptului are un tip Vector3, astfel încât prima opțiune de lucrări. Dar, în al doilea caz, trebuie să scrie supraîncărca deja structura Vector3, nu 2. Pentru a nu intra în implementarea clasei Vector3, putem scrie o caracteristică user-friendly:

    Exemple suprasarcini de operatori diferiți, cu unele explicații

    Exemplu de suprasarcină pentru binar +, -, *, /,%

    EXEMPLU suprasarcina postfix incrementare și decrementare (var ++, var--)

    EXEMPLU suprasarcina formulare prefix incrementare și decrementare (++ var, --var)

    Supraîncărcarea operații aritmetice cu obiecte ale altor clase

    La suprasarcină plus unar (+)

    Supraîncărcarea minus unar (-)

    operații EXEMPLU de atribuire a compusului de suprasarcină + = - =, =, / =,% =

    Un bun exemplu de operatori de comparare de suprasarcină ==. =,>, <,>= <=

    EXEMPLU operațiuni de suprasarcină typecasting (tip)

    EXEMPLU supraîncărca operatorii logici. , ||

    Exemplu supraîncărcare Operatorii la nivel de bit

    Exemplu de atribuire compus supraîncărcare bitwise =, | =, ^ =, <<=,>> =

    Un exemplu de supraîncărcarea operatorului de lucru cu indicii, și membrii clasei [] () *, -> -> *
    Nu văd nici un motiv pentru a supraîncărca (* -> -> *), astfel încât exemplele de mai jos nu va.

    Cum se supraîncărca noi și șterge. exemple:

    Operator Supraîncărcarea virgulă,
    Atenție! A nu se confunda cu transferurile operatorul virgulă semnului! (Vector3 var1, var2;)