„C ++“ operatoriaus perkrova (su pavyzdžiais)

Š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 Complexsudė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, charIr pan.

C ++ operatoriaus perkrovos sintaksė

Norėdami perkrauti operatorių, mes naudojame specialią operatorfunkciją.

 class className (… public returnType operator symbol (arguments) (… )… );

Čia

  • returnType yra funkcijos grąžinimo tipas.
  • operatorius yra raktinis žodis.
  • symbolyra operatorius, kurį norime perkrauti. Kaip: +, <, -, ++, ir tt
  • arguments 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 constlaikomas gera praktika, nes tai neleidžia operatoriaus funkcijai keisti komplekso2.
Dvejetainių operatorių perkrova C ++

Dalykai, kuriuos reikia atsiminti naudojant „C ++“ operatoriaus perkrovą

  1. 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.
  2. Operatoriaus perkrova negali pakeisti operatorių pirmenybės ir asociatyvumo. Tačiau jei norime pakeisti vertinimo tvarką, reikėtų naudoti skliaustus.
  3. Yra 4 operatoriai, kurių negalima perkrauti C ++. Jie yra:
    1. :: (taikymo srities skiriamoji geba)
    2. . (narių pasirinkimas)
    3. .* (nario pasirinkimas per rodyklę, kad veiktų)
    4. ?: (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?

Įdomios straipsniai...