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:
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.
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.
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ă:
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;)