Reacoperirea

16.1. reguli generale

În C ++ operatorii de limbaj de programare sunt tratate ca funcții care au următorul prototip:

operator de tip imya_operatora (lista);

Aici operatorul - cuvântul cheie. Prin urmare, operatorii, precum și funcții, poate fi supraîncărcat. Transbordate aproape toți operatorii, cu excepția cazurilor menționate mai jos:

 nu poate supraîncărca următorii operatori:

. - punctul, accesul operatorului la un membru al clasei;

.* - accesul operatorului la un membru al clasei prin indicatorul;

. - operatorul scope;

Operatorii  preprocessor nu poate fi supraîncărcat:

# - conversia unui șir;

 nu poate supraîncărca operatorii sizeof și typeof;

 operatorii de suprasarcină nu poate converti tipurile de date:

static_cast. const_cast. reinterpret_cast. dynamic_cast.

Supraîncărcarea operatorii trebuie să îndeplinească următoarele cerințe:

 nu poate introduce nici noi operatori;

 să nu fie supraîncărcat operatorii cu un tipuri de date built-in ca parametri, clasa operator de tip, cel puțin un parametru care urmează să fie supraîncărcat;

 operatorul nu se poate schimba numărul de parametri;

 operatorii asociativitatea supraîncărcat nu este schimbat;

 operatorii prioritățile supraîncărcate nu se schimba;

 operatorul nu poate avea argumente implicite, cu excepția operatorului funcția de apel ();

 operator poate avea un număr nedeterminat de parametri, cu excepția operatorului funcția de apel ().

Operatorii supraincarcate li se permite să fie definite ca membri de clasă și în funcție de care nu sunt membre ale clasei. Un operator poate fi supraîncărcat de mai multe ori. În cazul în care operatorul este suprasolicitat ca membru al clasei, atunci nu ar trebui să fie Specificator static și primul operand este obiectul implicit al clasei pentru care acest operator se numește. În acest caz, primul tip de conversie argument un astfel de operator de tipul de primul parametru nu este produs din cauza imposibilității punerii sale în aplicare eficientă. Atunci când alegeți modul în care să supraîncărca operatorul trebuie să ia în considerare semantica sa, adică. E. Înțeles. Ar fi frumos dacă operatorul supraîncărcări să ia în considerare faptul că acestea efectuează operațiuni de cele mai multe ori algebrice pe obiecte și astfel să păstreze natura algebrică a acestor operatori.

Supraîncărcarea operatorilor unari și binari va lua în considerare exemplul clasei Bool. definiția care este prezentată în Listing 16.1.

Listarea 16.1. Definiția de clasă chiar numere

#if! definit #define bool bool

// mai degrabă operatori plus logică și multiplicarea

bool operatorul + = (const Bool b); bool Operatorul * = (const Bool b);

// conversie de tip operator de

bool operatorul (void) const;

// unar logic prieten operatorul negație operatorul Bool! (Const Bool b);

// binari plus și de multiplicare logic prieten operatorul Bool + (Const Bool B1, const Bool b2); Operatorul prieten Bool * (Const Bool B1, const Bool b2);

// operatori de comparare binare

Operatorul prieten Bool == (Const Bool B1, const Bool b2); prietenul operatorului Bool! = (const Bool B1, const Bool b2);

prieten std :: istream Operatorul >> (std :: istream în, Bool b); prieten std :: ostream operator <<(std::ostream& out,

const Bool b);

Punerea în aplicare a operatorilor supraîncărcate vor fi prezentate în secțiunile următoare. În același timp, observăm că majoritatea operatorilor în cauză au o implementare simplă. Prin urmare, ele pot fi definite în mod direct în corpul clasei ca un built-in functii.

Rețineți că operatorii supraîncărcate pot fi invocate în două moduri: în mod explicit, ca funcție, sau implicit folosind notația operatorului. De exemplu, peste obiecte de tip Bool poate efectua următoarele operațiuni: