Supraîncărcarea operatorului în c

Supraîncărcarea operatorului în c

În mai multe limbi, operatorii sunt utilizate de programare: cel puțin o misiune și operatorii aritmetici (+ - * și / ..) (= sau similar.). În majoritatea limbilor cu tastare statică, acești operatori sunt obligați să introducă tipuri. De exemplu, în Java, adăugarea cu operatorul + este posibilă numai pentru numere întregi, numere în virgulă mobilă și șiruri de caractere. Dacă definim clasele de obiecte matematice, de exemplu, pentru matrici, putem pune în aplicare o metodă de a le adăuga, dar se poate numi doar ceva de genul: a = b.add (c).







În C ++, nu există o astfel de restricție - putem supraîncărca aproape orice operator cunoscut. Posibilitățile nu sunt găsite: puteți alege orice combinație de tipuri de operanzi, singura restricție fiind necesitatea existenței a cel puțin unui operand de tipul unui utilizator. Adică, nu puteți defini un operator nou peste tipurile încorporate sau să suprascrieți unul existent.

Când trebuie să fie supraîncărcate operatorii?

Amintiți-vă de principalul lucru: supraîncărcați operatorii dacă și numai dacă are sens. Asta este, dacă sentimentul supraîncărcării este evident și nu are surprize ascunse. Operatorii suprasolicitați ar trebui să acționeze în același mod ca și versiunile de bază. Firește, excepțiile sunt permise, dar numai în cazurile în care sunt însoțite de explicații ușor de înțeles. Un bun exemplu sunt operatorii <<и>> biblioteca standard iostream. care se comportă în mod explicit nu ca operatorii obișnuiți de schimbare de biți.

Oferim exemple bune și rele pentru supraîncărcarea operatorului. Adăugarea de matrici de mai sus este un caz evident. Aici, supraîncărcarea operatorului de adăugare este intuitiv de înțeles și, dacă este implementată corect, nu necesită explicații:

Un exemplu de supraîncărcare necorespunzătoare a operatorului de adăugare este adăugarea a două obiecte de tip "player" în joc. Ce a însemnat creatorul de clasă? Care va fi rezultatul? Nu știm ce face operația și, prin urmare, este periculos să utilizați acest operator.







Cum să supraîncărcați operatorii?

Operatorii de supraîncărcare sunt asemănători cu funcțiile de supraîncărcare cu nume speciale. De fapt, atunci când compilatorul vede expresia, în care este operatorul și tipul de utilizator, înlocuiește expresia apelului funcției corespunzătoare unui operator supraîncărcat. Cele mai multe nume încep cu operatorul de cuvinte cheie. urmată de desemnarea operatorului corespunzător. În cazul în care desemnarea nu este un membru al simbolurilor specifice, de exemplu, în cazul acționării operatorului sau a tipului de management al memoriei (nou. Delete, etc), precum și desemnarea cuvântul operatorului trebuie să fie separate de un operator de spațiu (operator nou), în alte cazuri, un spațiu poate fi neglijată (operator + ).

Majoritatea operatorilor pot fi supraîncărcați atât cu metode de clasă, cât și cu funcții simple, dar există câteva excepții. Atunci când un operator supraîncărcat este o metodă de clasă, tipul primului operand trebuie să fie această clasă (întotdeauna * aceasta), iar al doilea trebuie declarat în lista de parametri. În plus, operatorii de metodă nu sunt statici, cu excepția operatorilor de gestionare a memoriei.

Atunci când operatorul este supraîncărcat în metoda de clasă, acesta are acces la câmpurile private ale clasei, dar conversia ascunsă a primului argument nu este disponibilă. Prin urmare, funcțiile binare sunt de obicei supraîncărcate ca funcții libere. exemplu:

Atunci când operatorii unari sunt supraîncărcați ca funcții libere, aceștia pot accesa conversia ascunsă a argumentului, dar acesta nu este de obicei utilizat. Pe de altă parte, această proprietate este necesară pentru operatorii binari. Prin urmare, sfatul principal este:

Implementați operatorii unari și operatorii binari de tip "X =" sub formă de metode de clasă și alți operatori binari ca funcții libere.

Ce operatori pot fi supraîncărcați?

Putem suprasolicita aproape orice operator C ++, având în vedere următoarele excepții și limitări:

  • Nu puteți defini un nou operator, de exemplu, operatorul **.
  • Următorii operatori nu pot fi supraîncărcați:
    1. . (operatorul ternar);
    2. . (acces la nume imbricate);
    3. . (acces la câmpuri);
    4. .* (accesul la câmpuri prin pointer);
    5. sizeof. operatorii tipizate și distribuitorii.
  • Următorii operatori pot fi supraîncărcați numai ca metode:
    1. = (cesiune);
    2. -> (accesul la câmpuri prin pointer);
    3. () (apel funcțional);
    4. [] (acces prin index);
    5. -> * (accesul la pointer-on-the-field de pointer);
    6. conversie și gestionarea memoriei.
  • Numărul operanților, ordinea execuției și asociativitatea operatorilor este determinată de versiunea standard.
  • Cel puțin un operand trebuie să fie un tip definit de utilizator. Typedef nu contează.

Traducerea articolului "Supraîncărcarea operatorilor: elementele de bază"







Articole similare

Trimiteți-le prietenilor: