C++ Operator Supraîncărcare cu exemple
Ce Este Operator Supraîncărcare?
Utilizarea supraîncărcarea operatorului in 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 C++ operatori. De asemenea, puteți utiliza supraîncărcarea operatorului pentru a efectua diferite operații folosind un singur operator.
Sintaxă
A supraîncărca a C++ operator, ar trebui să definiți o funcție specială în interiorul clasei după cum urmează:
class class_name { ... .. ... public return_type operator symbol (argument(s)) { ... .. ... } ... .. ... };
Iată o explicație pentru sintaxa de mai sus:
- Return_type este tipul returnat pentru funcție.
- Apoi, menționați cuvântul cheie operator.
- Simbolul indică simbolul operatorului care trebuie supraîncărcat. De exemplu, +, -, <, ++.
- Argumentele pot fi transmise funcției operator în același mod ca și funcțiile.
Exemplu 1
#include <iostream> 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:
Explicația codului:
- 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-i folosi clasele 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.
- Supraîncărcați semnificația operatorului —.
- Operatorul va decrementa 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 numită funcție Display().
- Tipăriți valoarea numărului de variabile alături de alt text de pe consolă atunci 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 această funcție.
- Creați o instanță a clasei TestClass și dați-i numele tc.
- Aceasta va apela funcția operator void –().
- Utilizați poziția TestClass Class pentru a apela funcția Display().
- Funcția trebuie să returneze valoarea după finalizarea cu succes.
- Sfârșitul corpului funcției main().
Diferite abordări ale Operator Supraîncărcarea î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 de prieten
- Funcția de supraîncărcare a operatorului poate fi o funcție membru atunci când un operand Left este un obiect al clasei.
- Când operandul stânga este diferit, Operafuncția de supraîncărcare tor ar trebui să fie o funcție non-membru.
Puteți face ca funcția de supraîncărcare a operatorului să fie o funcție prietenă dacă trebuie să acceseze membrii clasei private și protejate.
Pot toate C++ Operatori să fie supraîncărcat?
Nu. Există C++ operatori care nu pot fi supraîncărcați.
Acestea includ:
- :: -Operator rezolutie domeniul de aplicare
- ?: -operator ternar.
- . -selector de membri
- Dimensiunea operatorului
- * -member pointer selector
Lucruri de reținut
- 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 tipurile încorporate (float, char, int etc.).
- = și & C++ operatorii sunt supraîncărcați în mod implicit. De exemplu, puteți copia obiectele aceleiași clase direct folosind operatorul =.
- Operaprioritatea tor nu modifică asociativ și prioritatea operatorilor. Cu toate acestea, puteți modifica ordinea evaluării folosind paranteze.
- Există patru operatori în care nu puteți supraîncărca C++. Acestea includ operatorul de rezoluție a domeniului (::), operatorul de selecție a membrilor (.), selectarea membrilor printr-un indicator către operatorul de funcție (.*) și operatorul ternar (?:).
Reguli pentru Operator Supraîncărcare
Aici sunt reguli pentru Operator Supraîncărcare:
- Pentru ca acesta să funcționeze, cel puțin un operand trebuie să fie un obiect de clasă definit de utilizator.
- Puteți supraîncărca 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 prieten. Cu toate acestea, astfel de operatori pot fi supraîncărcați folosind funcția membru.
Cum să supraîncărcați OperaTdR
Exemplu 1
#include <iostream> 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:
Explicația codului:
- 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-i folosi clasele fără a-l apela.
- Creați o clasă numită OperatorSupraîncărcare.
- 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.
- Utilizați un constructor de clasă pentru a inițializa variabila x la 10.
- Supraîncărcaț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 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 această funcție.
- Creați o instanță a OperatorOverload Clasa numită ov.
- Aceasta va apela funcția operator void ++().
- Folosește poziția de OperaClasa torOverload pentru a apela funcția Print().
- Funcția trebuie să returneze valoarea după finalizarea cu succes.
- Sfârșitul corpului funcției main().
Exemplu 2
#include<iostream> using 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:
Explicația codului:
- Includerea fișierului antet iostream în programul nostru pentru a utiliza funcțiile acestuia.
- 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ă 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 de clasă și inițializarea variabile.
- Inițializați valoarea variabilei real.
- Inițializați valoarea variabilei peste.
- Sfârșitul corpului constructorului.
- Suprascrieți semnificația operatorului +.
- Creați rezultatul tipului de date de tip TestClass.
- Utilizați operatorul + cu numere complexe. Această linie va adăuga partea reală a unui număr la partea reală a altui număr.
- Utilizați operatorul + cu numere complexe. Această linie va adăuga partea imaginară a unui număr la partea imaginară a altui număr.
- Programul va returna valoarea rezultatului variabilei la executarea cu succes.
- Sfârșitul definiției noului sens al operatorului +, adică supraîncărcarea.
- Apelați metoda print().
- Tipăriți noul număr complex după adăugare pe consolă.
- Sfârșitul corpului funcției print().
- Sfârșitul corpului clasei TestClass.
- Apelarea funcției main().
- Transmiterea valorilor atât a părților reale, cât și a celor complexe de adăugat. Prima parte a lui c1 va fi adăugată la prima parte a lui 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 a C++ operator într-un singur domeniu.
- Aceasta se numește supraîncărcare a operatorului.
- Operasupraîncărcarea tor oferă o semnificație specială a unui operator pentru un tip de date definit de utilizator.
- Puteți redefini majoritatea C++ operatori prin suprasolicitarea operatorilor.
- Nu tot C++ operatorii 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.