Šioje pamokoje su pavyzdžių pagalba sužinosime apie operatoriaus perkrovą.
C ++ versijoje galime pakeisti operatorių darbo būdą naudotojo apibrėžtiems tipams, pavyzdžiui, objektams ir struktūroms. Tai vadinama operatoriaus perkrova . Pavyzdžiui,
Tarkime, kad mes sukūrėme tris objektus c1, c2 ir gauname iš klasės, pavadintos Complex
sudėtiniais skaičiais.
Kadangi operatoriaus perkrova leidžia mums pakeisti operatorių darbą, galime iš naujo apibrėžti +
operatoriaus veikimą ir naudoti jį pridėdami kompleksinius c1 ir c2 skaičius parašydami šį kodą:
result = c1 + c2;
vietoj kažko panašaus
result = c1.addNumbers(c2);
Tai daro mūsų kodą intuityvų ir lengvai suprantamą.
Pastaba: mes negalime naudoti operatoriaus perkrovos pagrindiniams duomenų tipams, pvz int
. float
, char
Ir pan.
C ++ operatoriaus perkrovos sintaksė
Norėdami perkrauti operatorių, mes naudojame specialią operator
funkciją.
class className (… public returnType operator symbol (arguments) (… )… );
Čia
returnType
yra funkcijos grąžinimo tipas.- operatorius yra raktinis žodis.
symbol
yra operatorius, kurį norime perkrauti. Kaip:+
,<
,-
,++
, ir ttarguments
yra funkcijai perduoti argumentai.
Operatoriaus perkrova vienarūšiuose operatoriuose
Unariniai operatoriai veikia tik viename operande. Prieaugis operatorius ++
ir Mažėja operatorius --
pavyzdžiai Smūginės operatorių.
1 pavyzdys: ++ Operatoriaus (Unary Operator) perkrova
// Overload ++ when used as prefix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++ () ( ++value; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++ ()" function ++count1; count1.display(); return 0; )
Rezultatas
Skaičius: 6
Čia, kai mes naudojame ++count1;
, void operator ++ ()
vadinamas. Tai padidina objekto count1 vertės atributą 1.
Pastaba: kai perkrauname operatorius, galime jį naudoti norėdami dirbti bet kokiu būdu. Pavyzdžiui, mes būtume galėję ++
padidinti vertę 100.
Tačiau dėl to mūsų kodas yra painus ir sunkiai suprantamas. Mūsų, kaip programuotojo, darbas yra tinkamai, nuosekliai ir intuityviai naudoti operatoriaus perkrovą.
Ankstesnis pavyzdys veikia tik tada, kai ++
naudojamas kaip priešdėlis. Norėdami, kad ++
darbas būtų kaip postfix, mes naudojame šią sintaksę.
void operator ++ (int) ( // code )
Atkreipkite dėmesį int
į skliaustų vidų. Tai sintaksė, naudojama vienkartiniams operatoriams naudoti kaip postfix; tai nėra funkcijos parametras.
2 pavyzdys: ++ Operatoriaus (Unary Operator) perkrova
// Overload ++ when used as prefix and postfix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++ () ( ++value; ) // Overload ++ when used as postfix void operator ++ (int) ( ++value; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++ (int)" function count1++; count1.display(); // Call the "void operator ++ ()" function ++ count1; count1.display(); return 0; )
Rezultatas
Skaičius: 6 Skaičius: 7
2 pavyzdys veikia, kai ++
naudojamas kaip priešdėlis ir postfiksas. Tačiau tai neveikia, jei bandome padaryti kažką panašaus:
Count count1, result; // Error result = ++count1;
Taip yra todėl, kad mūsų operatoriaus funkcijos grąžinimo tipas yra void
. Mes galime išspręsti šią problemą, nustatydami Count
, kad operatoriaus funkcijos grąžinimo tipas.
// return Count when ++ used as prefix Count operator ++ () ( // code ) // return Count when ++ used as postfix Count operator ++ (int) ( // code )
3 pavyzdys: grąžinimo vertė iš operatoriaus funkcijos (++ operatorius)
#include using namespace std; class Count ( private: int value; public : // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; ) // Overload ++ when used as postfix Count operator ++ (int) ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1, result; // Call the "Count operator ++ ()" function result = ++count1; result.display(); // Call the "Count operator ++ (int)" function result = count1++; result.display(); return 0; )
Rezultatas
Skaičius: 6 Skaičius: 7
Čia prefiksų operatoriaus perkrovimui naudojome šį kodą:
// Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; )
„Postfix“ operatoriaus perkrovos kodas taip pat yra tas pats. Atkreipkite dėmesį, kad mes sukūrėme objekto temp ir grąžino jo vertę operatoriaus funkcijai.
Taip pat atkreipkite dėmesį į kodą
temp.value = ++value;
Kintamoji reikšmė priklauso objektui count1, main()
nes count1 kviečia funkciją, o temp.value priklauso temp objektui.
Operatoriaus perkrova dvejetainiuose operatoriuose
Dvejetainiai operatoriai dirba dviem operandais. Pavyzdžiui,
result = num + 9;
Čia +
yra dvejetainis operatorius, veikiantis operandais num ir 9
.
Kai perkrauname vartotojo nustatytų tipų dvejetainį operatorių naudodami kodą:
obj3 = obj1 + obj2;
Operatoriaus funkcija iškviečiama naudojant objektą obj1 ir obj2 perduodamas kaip argumentas funkcijai.
4 pavyzdys: C ++ dvejetainio operatoriaus perkrova
// C++ program to overload the binary operator + // This program adds two complex numbers #include using namespace std; class Complex ( private: float real; float imag; public: // Constructor to initialize real and imag to 0 Complex() : real(0), imag(0) () void input() ( cout <> real; cin>> imag; ) // Overload the + operator Complex operator + (const Complex& obj) ( Complex temp; temp.real = real + obj.real; temp.imag = imag + obj.imag; return temp; ) void output() ( if (imag < 0) cout << "Output Complex number: " << real << imag << "i"; else cout << "Output Complex number: " << real << "+" << imag << "i"; ) ); int main() ( Complex complex1, complex2, result; cout << "Enter first complex number:"; complex1.input(); cout << "Enter second complex number:"; complex2.input(); // complex1 calls the operator function // complex2 is passed as an argument to the function result = complex1 + complex2; result.output(); return 0; )
Rezultatas
Įveskite pirmąjį kompleksinį skaičių: Įveskite tikrąją ir įsivaizduojamąsias dalis: 9 5 Įveskite antrąjį kompleksinį numerį: Įveskite tikrąją ir įsivaizduojamąsias dalis: 7 6 Išvesties komplekso numeris: 16 + 11i
Šioje programoje operatoriaus funkcija yra:
Complex operator + (const Complex& obj) ( // code )
Vietoj to mes taip pat galėjome parašyti šią funkciją taip:
Complex operator + (Complex obj) ( // code )
Tačiau
- naudojimas
&
daro mūsų kodą efektyvų nurodant objektą complex2, užuot padarius objekto kopiją operatoriaus funkcijos viduje. - naudojimas
const
laikomas gera praktika, nes tai neleidžia operatoriaus funkcijai keisti komplekso2.

Dalykai, kuriuos reikia atsiminti naudojant „C ++“ operatoriaus perkrovą
- Du operatoriai
=
ir&
jau yra perkrauti pagal numatytuosius nustatymus C ++. Pavyzdžiui, norėdami nukopijuoti tos pačios klasės objektus, galime tiesiogiai naudoti=
operatorių. Mums nereikia kurti operatoriaus funkcijos. - Operatoriaus perkrova negali pakeisti operatorių pirmenybės ir asociatyvumo. Tačiau jei norime pakeisti vertinimo tvarką, reikėtų naudoti skliaustus.
- Yra 4 operatoriai, kurių negalima perkrauti C ++. Jie yra:
::
(taikymo srities skiriamoji geba).
(narių pasirinkimas).*
(nario pasirinkimas per rodyklę, kad veiktų)?:
(trijų dalių operatorius)
Apsilankykite šiuose puslapiuose ir sužinokite daugiau apie:
- Kaip teisingai perkrauti prieaugio operatorių?
- Kaip perkrauti dvejetainį operatorių - atimti sudėtingus skaičius?