Ce este supraîncărcarea operatorului?
Folosind supraîncărcarea operatorului în C ++, puteți specifica mai multe semnificații pentru un operator într-un singur domeniu. Scopul supraîncărcării operatorului este de a oferi o semnificație specială a unui operator pentru un tip de date definit de utilizator.
Cu ajutorul supraîncărcării operatorului, puteți redefini majoritatea operatorilor C ++. De asemenea, puteți utiliza supraîncărcarea operatorului pentru a efectua operațiuni diferite folosind un singur operator.
În acest tutorial C ++, veți învăța:
- Ce este supraîncărcarea operatorului?
- Sintaxă
- Abordări diferite ale supraîncărcării operatorului în C ++
- Pot fi supraîncărcați toți operatorii C ++?
- Lucruri de amintit:
- Reguli pentru supraîncărcarea operatorului:
- Cum să suprasolicitați operatorul:
Sintaxă
Pentru a supraîncărca un operator C ++, ar trebui să definiți o funcție specială în cadrul clasei după cum urmează:
class class_name{… publicreturn_type operator symbol (argument(s)){… }… };
Iată o explicație pentru sintaxa de mai sus:
- Return_type este tipul return pentru funcție.
- Apoi, menționați cuvântul cheie operator.
- Simbolul indică faptul că simbolul operatorului trebuie supraîncărcat. De exemplu, +, -, <, ++.
- Argumentul (argumentele) poate fi transmis funcției operator în același mod ca funcțiile.
Exemplul 1:
#includeusing namespace std;class TestClass {private:int count;public:TestClass() : count(5) {}void operator --() {count = count - 3;}void Display() {cout << "Count: " << count; }};int main() {TestClass tc;--tc;tc.Display();return 0;}
Ieșire:
Iată o captură de ecran a codului:
Explicatie cod:
- Includerea fișierului antet iostream în codul nostru pentru a-și folosi funcțiile.
- Includeți spațiul de nume std în programul nostru pentru a utiliza clasele sale fără a-l apela.
- Creați o clasă numită TestClass.
- Utilizați modificatorul de acces privat, care marchează un membru al clasei ca fiind accesibil privat.
- Creați un număr de variabile întregi. Această variabilă va fi accesibilă în mod privat.
- Utilizați modificatorul de acces public, care marchează un membru al clasei ca fiind accesibil privat.
- Utilizați un constructor de clasă pentru a inițializa contorul variabilei la 5.
- Suprasolicitați semnificația operatorului -.
- Operatorul va diminua valoarea variabilei x cu 1.
- Sfârșitul secțiunii de supraîncărcare a operatorului. Operatorului i s-a dat un nou nume.
- Definirea unei funcții denumită funcția Display ().
- Imprimați valoarea numărului variabilelor alături de alt text de pe consolă când este apelată funcția Display (). } Marchează sfârșitul corpului funcției Display ().
- Sfârșitul corpului clasei.
- Apelați funcția main (). Logica programului ar trebui adăugată în cadrul acestei funcții.
- Creați o instanță a clasei TestClass și dați-i numele tc.
- Aceasta va apela funcția operatorului gol - ().
- Utilizați poziția clasei TestClass pentru a apela funcția Display ().
- Funcția trebuie să returneze valoarea la finalizarea cu succes.
- Sfârșitul corpului funcției main ().
Abordări diferite ale supraîncărcării operatorului în C ++
Puteți efectua supraîncărcarea operatorului prin implementarea oricăruia dintre următoarele tipuri de funcții:
- Funcția de membru
- Funcția non-membru
- Funcția prieten
- Funcția de supraîncărcare a operatorului poate fi o funcție membru atunci când un operand stâng este un obiect al clasei.
- Când operandul din stânga este diferit, funcția de supraîncărcare a operatorului ar trebui să fie o funcție nemembră.
Puteți face funcția de supraîncărcare a operatorului o funcție de prieten dacă are nevoie să acceseze membrii clasei private și protejate.
Pot fi supraîncărcați toți operatorii C ++?
Nu. Există operatori C ++ care nu pot fi supraîncărcați.
Ei includ:
- :: -Operator de rezoluție domeniu
- ?: -operator intern.
- . -selector de membri
- Dimensiunea operatorului
- * - selector de pointer membru
Lucruri de amintit:
- Cu supraîncărcarea operatorului, puteți redefini modul în care un operator funcționează numai pentru tipurile definite de utilizator (obiecte, structuri). Nu îl puteți folosi pentru tipuri încorporate (float, char, int etc.).
- Operatorii = și & C ++ sunt supraîncărcați implicit. De exemplu, puteți copia obiectele aceleiași clase direct folosind operatorul =.
- Prioritatea operatorului nu schimbă asociativ și precedenta operatorilor. Cu toate acestea, puteți modifica ordinea evaluării folosind paranteze.
- Există patru operatori pe care nu îi puteți supraîncărca în C ++. Acestea includ operatorul de rezoluție a domeniului (: :), operatorul de selecție a membrilor (.), Selecția membrilor printr-un pointer către operatorul de funcție (. *) Și operatorul ternar (? :).
Reguli pentru supraîncărcarea operatorului:
Iată regulile pentru supraîncărcarea operatorului:
- Pentru ca acesta să funcționeze, cel puțin un operand trebuie să fie un obiect de clasă definit de utilizator.
- Puteți suprasolicita doar operatorii existenți. Nu puteți supraîncărca noi operatori.
- Unii operatori nu pot fi supraîncărcați folosind o funcție de prietenie. Cu toate acestea, astfel de operatori pot fi supraîncărcați folosind funcția membru.
Cum să suprasolicitați operatorul:
Exemplul 1:
#includeusing namespace std;class OperatorOverload {private:int x;public:OperatorOverload() : x(10) {}void operator ++() {x = x + 2;}void Print() {cout << "The Count is: " << x;}};int main() {OperatorOverload ov;++ov;ov.Print();return 0;}
Ieșire:
Iată o captură de ecran a codului:
Explicatie cod:
- Includerea fișierului antet iostream în codul nostru pentru a-și folosi funcțiile.
- Includeți spațiul de nume std în programul nostru pentru a utiliza clasele sale fără a-l apela.
- Creați o clasă numită OperatorOverload.
- Utilizați modificatorul de acces privat, care marchează un membru al clasei ca fiind accesibil privat.
- Creați o variabilă întreagă x. Această variabilă va fi accesibilă în mod privat.
- Utilizați modificatorul de acces public, care marchează un membru al clasei ca fiind accesibil privat.
- Folosiți un constructor de clase pentru a inițializa variabila x la 10.
- Suprasolicitați semnificația operatorului ++.
- Operatorul va crește valoarea variabilei x cu 2.
- Sfârșitul secțiunii de supraîncărcare a operatorului. Operatorului i s-a dat un nou nume.
- Apelarea funcției Print ().
- Imprimați valoarea variabilei x alături de alt text de pe consolă atunci când este apelată funcția Print ().
- Sfârșitul corpului funcției Print ().
- Sfârșitul corpului clasei.
- Apelați funcția main (). Logica programului ar trebui adăugată în cadrul acestei funcții.
- Creați o instanță a clasei OperatorOverload numită ov.
- Aceasta va apela funcția de operator void ++ ().
- Utilizați poziția clasei OperatorOverload pentru a apela funcția Print ().
- Funcția trebuie să returneze valoarea la finalizarea cu succes.
- Sfârșitul corpului funcției main ().
Exemplul 2:
#includeusing namespace std;class TestClass {private:int real, over;public:TestClass(int rl = 0, int ov = 0) {real = rl;over = ov;}TestClass operator + (TestClass const &obj) {TestClass result;result.real = real + obj.real;result.over = over + obj.over;return result;}void print() {cout << real << " + i" << over << endl;}};int main(){TestClass c1(9, 5), c2(4, 3);TestClass c3 = c1 + c2;c3.print();}
Ieșire:
Iată o captură de ecran a codului:
Explicatie cod:
- Includerea fișierului antet iostream în programul nostru pentru a-și folosi funcțiile.
- Includeți spațiul de nume std în programul nostru pentru a utiliza clasele sale fără a-l apela.
- Creați o clasă numită TestClass. {Marchează începutul corpului clasei.
- Utilizați modificatorul de acces privat pentru a marca variabilele ca private, ceea ce înseamnă că acestea pot fi accesate numai din cadrul clasei.
- Definiți două variabile întregi, reale și peste.
- Utilizați modificatorul de acces public pentru a marca constructorul ca public, ceea ce înseamnă că va fi accesibil chiar și în afara clasei.
- Crearea constructorului clasei și inițializarea variabilelor.
- Inițializați valoarea variabilei reale.
- Inițializați valoarea variabilei peste.
- Sfârșitul corpului constructorului.
- Înlocuiți semnificația operatorului +.
- Creați rezultatul tipului de date al tipului TestClass.
- Folosiți operatorul + cu numere complexe. Această linie va adăuga partea reală a unui număr la partea reală a unui alt număr.
- Folosiți operatorul + cu numere complexe. Această linie va adăuga partea imaginară a unui număr la partea imaginară a unui alt număr.
- Programul va returna valoarea rezultatului variabilei la executarea cu succes.
- Sfârșitul definiției noului sens al operatorului +, adică supraîncărcare.
- Apelați metoda print ().
- Imprimați noul număr complex după adăugare pe consolă.
- Functia de sfarsit a corpului print ().
- Sfârșitul corpului clasei TestClass.
- Apelarea funcției main ().
- Trecerea valorilor părților reale și complexe care trebuie adăugate. Prima parte a c1 va fi adăugată la prima parte a c2, adică 9 + 4. A doua parte a lui c1 va fi adăugată la a doua parte a lui c, adică 5 + 3.
- Efectuarea unei operații folosind operatorul + supraîncărcat și stocarea rezultatului în variabila c3.
- Imprimarea valorii variabilei c3 pe consolă.
- Sfârșitul corpului funcției main ().
Rezumat:
- Puteți specifica mai multe semnificații pentru un operator C ++ într-un singur domeniu.
- Aceasta se numește supraîncărcare a operatorului.
- Supraîncărcarea operatorului oferă o semnificație specială a unui operator pentru un tip de date definit de utilizator.
- Puteți redefini majoritatea operatorilor C ++ prin supraîncărcarea operatorului.
- Nu toți operatorii C ++ pot fi supraîncărcați.
- Pentru ca un operator să fie supraîncărcat, cel puțin unul dintre operanzi trebuie să fie un obiect definit de utilizator.
- Numai operatorii existenți pot fi supraîncărcați. Nu puteți supraîncărca noi operatori.