Supraîncărcarea operatorului C ++ cu exemple

Cuprins:

Anonim

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:

#include using 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:

  1. Includerea fișierului antet iostream în codul nostru pentru a-și folosi funcțiile.
  2. Includeți spațiul de nume std în programul nostru pentru a utiliza clasele sale fără a-l apela.
  3. Creați o clasă numită TestClass.
  4. Utilizați modificatorul de acces privat, care marchează un membru al clasei ca fiind accesibil privat.
  5. Creați un număr de variabile întregi. Această variabilă va fi accesibilă în mod privat.
  6. Utilizați modificatorul de acces public, care marchează un membru al clasei ca fiind accesibil privat.
  7. Utilizați un constructor de clasă pentru a inițializa contorul variabilei la 5.
  8. Suprasolicitați semnificația operatorului -.
  9. Operatorul va diminua valoarea variabilei x cu 1.
  10. Sfârșitul secțiunii de supraîncărcare a operatorului. Operatorului i s-a dat un nou nume.
  11. Definirea unei funcții denumită funcția Display ().
  12. 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 ().
  13. Sfârșitul corpului clasei.
  14. Apelați funcția main (). Logica programului ar trebui adăugată în cadrul acestei funcții.
  15. Creați o instanță a clasei TestClass și dați-i numele tc.
  16. Aceasta va apela funcția operatorului gol - ().
  17. Utilizați poziția clasei TestClass pentru a apela funcția Display ().
  18. Funcția trebuie să returneze valoarea la finalizarea cu succes.
  19. 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:

  1. Funcția de membru
  2. Funcția non-membru
  3. 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:

  1. 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.).
  2. Operatorii = și & C ++ sunt supraîncărcați implicit. De exemplu, puteți copia obiectele aceleiași clase direct folosind operatorul =.
  3. Prioritatea operatorului nu schimbă asociativ și precedenta operatorilor. Cu toate acestea, puteți modifica ordinea evaluării folosind paranteze.
  4. 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:

#include using 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:

  1. Includerea fișierului antet iostream în codul nostru pentru a-și folosi funcțiile.
  2. Includeți spațiul de nume std în programul nostru pentru a utiliza clasele sale fără a-l apela.
  3. Creați o clasă numită OperatorOverload.
  4. Utilizați modificatorul de acces privat, care marchează un membru al clasei ca fiind accesibil privat.
  5. Creați o variabilă întreagă x. Această variabilă va fi accesibilă în mod privat.
  6. Utilizați modificatorul de acces public, care marchează un membru al clasei ca fiind accesibil privat.
  7. Folosiți un constructor de clase pentru a inițializa variabila x la 10.
  8. Suprasolicitați semnificația operatorului ++.
  9. Operatorul va crește valoarea variabilei x cu 2.
  10. Sfârșitul secțiunii de supraîncărcare a operatorului. Operatorului i s-a dat un nou nume.
  11. Apelarea funcției Print ().
  12. Imprimați valoarea variabilei x alături de alt text de pe consolă atunci când este apelată funcția Print ().
  13. Sfârșitul corpului funcției Print ().
  14. Sfârșitul corpului clasei.
  15. Apelați funcția main (). Logica programului ar trebui adăugată în cadrul acestei funcții.
  16. Creați o instanță a clasei OperatorOverload numită ov.
  17. Aceasta va apela funcția de operator void ++ ().
  18. Utilizați poziția clasei OperatorOverload pentru a apela funcția Print ().
  19. Funcția trebuie să returneze valoarea la finalizarea cu succes.
  20. 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:

  1. Includerea fișierului antet iostream în programul nostru pentru a-și folosi funcțiile.
  2. Includeți spațiul de nume std în programul nostru pentru a utiliza clasele sale fără a-l apela.
  3. Creați o clasă numită TestClass. {Marchează începutul corpului clasei.
  4. Utilizați modificatorul de acces privat pentru a marca variabilele ca private, ceea ce înseamnă că acestea pot fi accesate numai din cadrul clasei.
  5. Definiți două variabile întregi, reale și peste.
  6. Utilizați modificatorul de acces public pentru a marca constructorul ca public, ceea ce înseamnă că va fi accesibil chiar și în afara clasei.
  7. Crearea constructorului clasei și inițializarea variabilelor.
  8. Inițializați valoarea variabilei reale.
  9. Inițializați valoarea variabilei peste.
  10. Sfârșitul corpului constructorului.
  11. Înlocuiți semnificația operatorului +.
  12. Creați rezultatul tipului de date al tipului TestClass.
  13. 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.
  14. 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.
  15. Programul va returna valoarea rezultatului variabilei la executarea cu succes.
  16. Sfârșitul definiției noului sens al operatorului +, adică supraîncărcare.
  17. Apelați metoda print ().
  18. Imprimați noul număr complex după adăugare pe consolă.
  19. Functia de sfarsit a corpului print ().
  20. Sfârșitul corpului clasei TestClass.
  21. Apelarea funcției main ().
  22. 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.
  23. Efectuarea unei operații folosind operatorul + supraîncărcat și stocarea rezultatului în variabila c3.
  24. Imprimarea valorii variabilei c3 pe consolă.
  25. 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.