C++ valodā operatora pārslodze ir kompilēšanas laika polimorfisms. Tā ir ideja piešķirt īpašu nozīmi esošam operatoram C++, nemainot tā sākotnējo nozīmi.
Šajā rakstā mēs tālāk apspriedīsim par operatoru pārslodzi C++ ar piemēriem un redzēsim, kurus operatorus mēs varam vai nevaram pārslogot C++.
C++ operatora pārslodze
C++ ir iespēja nodrošināt operatoriem īpašu nozīmi datu tipam, šī iespēja ir pazīstama kā operatora pārslodze. Operatora pārslodze ir kompilēšanas laika polimorfisms. Piemēram, mēs varam pārslogot operatoru “+” tādā klasē kā String, lai mēs varētu savienot divas virknes, vienkārši izmantojot +. Citas klases, kurās aritmētiskie operatori var būt pārslogoti, ir kompleksie skaitļi, daļskaitļi, lielie veselie skaitļi utt.
Piemērs:
int a; float b,sum; sum = a + b;>
Šeit mainīgie a un b ir int un float tipa, kas ir iebūvētie datu tipi. Tādējādi pievienošanas operators “+” var viegli pievienot a un b saturu. Tas ir tāpēc, ka pievienošanas operators + ir iepriekš definēts, lai pievienotu tikai iebūvēta datu tipa mainīgos.
Īstenošana:
kali linux komandas
C++
// C++ Program to Demonstrate the> // working/Logic behind Operator> // Overloading> class> A {> >statements;> };> int> main()> {> >A a1, a2, a3;> >a3 = a1 + a2;> >return> 0;> }> |
>
>
Šajā piemērā mums ir 3 A klases mainīgie a1, a2 un a3. Šeit mēs mēģinām pievienot divus objektus a1 un a2, kas ir lietotāja definēta tipa, t.i., A klases, izmantojot operatoru +. Tas nav atļauts, jo pievienošanas operators + ir iepriekš definēts, lai darbotos tikai ar iebūvētiem datu tipiem. Bet šeit A klase ir lietotāja definēts tips, tāpēc kompilators rada kļūdu. Šeit parādās operatora pārslodzes jēdziens.
Tagad, ja lietotājs vēlas, lai operators + pievienotu divus klases objektus, lietotājam ir atkārtoti jādefinē operatora + nozīme, lai tas pievienotu divus klases objektus. Tas tiek darīts, izmantojot operatora pārslodzes jēdzienu. Tātad galvenā operatora pārslodzes ideja ir izmantot C++ operatorus ar klases mainīgajiem vai klases objektiem. Operatoru nozīmes pārdefinēšana patiešām nemaina to sākotnējo nozīmi; tā vietā tiem ir piešķirta papildu nozīme kopā ar esošajiem.
Operatora pārslodzes piemērs programmā C++
C++
// C++ Program to Demonstrate> // Operator Overloading> #include> using> namespace> std;> class> Complex {> private>:> >int> real, imag;> public>:> >Complex(>int> r = 0,>int> i = 0)> >{> >real = r;> >imag = i;> >}> >// This is automatically called when '+' is used with> >// between two Complex objects> >Complex operator+(Complex>const>& obj)> >{> >Complex res;> >res.real = real + obj.real;> >res.imag = imag + obj.imag;> >return> res;> >}> >void> print() { cout << real <<>' + i'> << imag <<>'
'>; }> };> int> main()> {> >Complex c1(10, 5), c2(2, 4);> >Complex c3 = c1 + c2;> >c3.print();> }> |
>
>Izvade
12 + i9>
Atšķirība starp operatora funkcijām un parastajām funkcijām
Operatora funkcijas ir tādas pašas kā parastās funkcijas. Vienīgās atšķirības ir tādas, ka operatora funkcijas nosaukums vienmēr ir operatora atslēgvārds seko operatora simbols, un operatora funkcijas tiek izsauktas, kad tiek izmantots attiecīgais operators.
Piemērs
C++
#include> using> namespace> std;> class> Complex {> private>:> >int> real, imag;> public>:> >Complex(>int> r = 0,>int> i = 0)> >{> >real = r;> >imag = i;> >}> >void> print() { cout << real <<>' + i'> << imag << endl; }> >// The global operator function is made friend of this> >// class so that it can access private members> >friend> Complex operator+(Complex>const>& c1,> >Complex>const>& c2);> };> Complex operator+(Complex>const>& c1, Complex>const>& c2)> {> >return> Complex(c1.real + c2.real, c1.imag + c2.imag);> }> int> main()> {> >Complex c1(10, 5), c2(2, 4);> >Complex c3> >= c1> >+ c2;>// An example call to 'operator+'> >c3.print();> >return> 0;> }> |
>
>Izvade
12 + i9>
Vai mēs varam pārslogot visus operatorus?
Gandrīz visi operatori var tikt pārslogoti, izņemot dažus. Tālāk ir saraksts ar operatoriem, kurus nevar pārslogot.
sizeof typeid Scope resolution (::) Class member access operators (.(dot), .* (pointer to member operator)) Ternary or conditional (?:)>
Operatori, kurus var pārslogot C++
Mēs varam pārslogot
Unārie operatori Binārie operatori Speciālie operatori ( [ ], () utt.)
Bet starp tiem ir daži operatori, kurus nevar pārslogot. Viņi ir
Darbības jomas izšķiršanas operators (: dalībnieku atlases operators Dalībnieku atlase, izmantojot *
Norādiet uz dalībnieku mainīgo
- Nosacījuma operators (? Sizeof operator sizeof()
| Operatori, kurus var pārslogot | Piemēri |
|---|---|
| Binārā aritmētika | +, -, *, /, % |
| Unārā aritmētika | +, -, ++, — |
| Piešķiršana | =, +=,*=, /=,-=, %= |
| Bitu veidā | &, | , <> , ~ , ^ |
| Atsauces noņemšana | (->) |
| Dinamiskā atmiņas piešķiršana, Piešķiršanas atcelšana | Jauns, dzēst |
| Apakšraksts | [ ] |
| Funkcijas izsaukums | () |
| Loģiski | &, | |, ! |
| Relāciju | >, <, = =, = |
Kāpēc iepriekš minētie operatori nevar būt pārslogoti?
1. Operatora lielums
Tas atgriež objekta vai datu tipa lielumu, kas ievadīts kā operands. To novērtē kompilators, un to nevar novērtēt izpildlaikā. Pareiza rādītāja palielināšana objektu masīvā netieši ir atkarīga no operatora lieluma. Mainot tā nozīmi, izmantojot pārslodzi, sabruktu būtiska valodas daļa.
2. typeid Operator
Tas nodrošina CPP programmai iespēju atgūt faktiski atvasināto objekta veidu, uz kuru attiecas rādītājs vai atsauce. Šim operatoram galvenais ir unikāli identificēt veidu. Ja vēlamies, lai lietotāja definēts tips “izskatītos” pēc cita veida, var izmantot polimorfismu, taču tipa operatora nozīmei ir jāpaliek nemainīgai, pretējā gadījumā var rasties nopietnas problēmas.
3. Darbības jomas izšķirtspēja (::) Operators
Tas palīdz identificēt un norādīt kontekstu, uz kuru attiecas identifikators, norādot nosaukumvietu. Tas tiek pilnībā novērtēts izpildlaikā un darbojas uz nosaukumiem, nevis vērtībām. Tvēruma izšķirtspējas operandi ir piezīmju izteiksmes ar datu tipiem, un CPP nav sintakses to uztveršanai, ja tas būtu pārslogots. Tātad sintaktiski nav iespējams pārslogot šo operatoru.
4. Klases dalībnieku piekļuves operatori (.(punkt ), .* (rādītājs uz dalībnieka operatoru))
Klases dalībnieku piekļuves operatoru nozīmi un netiešo izmantošanu var saprast, izmantojot šādu piemēru:
Piemērs:
C++
// C++ program to demonstrate operator overloading> // using dot operator> #include> using> namespace> std;> class> ComplexNumber {> private>:> >int> real;> >int> imaginary;> public>:> >ComplexNumber(>int> real,>int> imaginary)> >{> >this>->reāls = reāls;> >this>->imaginary = imaginary;> >}> >void> print() { cout << real <<>' + i'> << imaginary; }> >ComplexNumber operator+(ComplexNumber c2)> >{> >ComplexNumber c3(0, 0);> >c3.real =>this>->real + c2.real;> >c3.imaginary =>this>->imaginary + c2.imaginary;> >return> c3;> >}> };> int> main()> {> >ComplexNumber c1(3, 5);> >ComplexNumber c2(2, 4);> >ComplexNumber c3 = c1 + c2;> >c3.print();> >return> 0;> }> |
>
livecricket.is
>Izvade
5 + i9>
Paskaidrojums:
Paziņojums ComplexNumber c3 = c1 + c2; iekšēji tiek tulkots kā KomplekssNumurs c3 = c1.operators+ (c2); lai izsauktu operatora funkciju. Arguments c1 tiek netieši nodots, izmantojot '.' operators. Nākamajā paziņojumā tiek izmantots arī punktu operators, lai piekļūtu dalībnieka funkcijai drukāt un nodot c3 kā argumentu.
Turklāt šie operatori strādā arī uz nosaukumiem, nevis vērtībām, un nav noteikuma (sintaktiski) tos pārslogot.
5. Trīskāršs vai nosacīts (?:) operators
Trīskāršais vai nosacītais operators ir if-else paziņojuma īss attēlojums. Operatorā patiesās/nepatiesās izteiksmes tiek novērtētas tikai, pamatojoties uz nosacījuma izteiksmes patiesības vērtību.
conditional statement ? expression1 (if statement is TRUE) : expression2 (else)>
Funkcija, kas pārslogo klases trīskāršo operatoru, piemēram, ABC, izmantojot definīciju
ABC operator ?: (bool condition, ABC trueExpr, ABC falseExpr);>
nevarētu garantēt, ka novērtēts tikai viens no izteicieniem. Tādējādi trīskāršu operatoru nevar pārslogot.
Svarīgi punkti par operatora pārslodzi
1) Lai operatora pārslodze darbotos, vismaz vienam no operandiem ir jābūt lietotāja definētam klases objektam.
2) Piešķiršanas operators: Kompilators katrai klasei automātiski izveido noklusējuma piešķiršanas operatoru. Noklusējuma piešķiršanas operators visus labās puses dalībniekus piešķir kreisajai pusei un vairumā gadījumu darbojas labi (šī darbība ir tāda pati kā kopijas konstruktors). Skatiet šo, lai iegūtu sīkāku informāciju.
3) Konversijas operators: Mēs varam arī uzrakstīt konvertēšanas operatorus, kurus var izmantot, lai pārveidotu vienu tipu citā.
Piemērs:
C++
// C++ Program to Demonstrate the working> // of conversion operator> #include> using> namespace> std;> class> Fraction {> private>:> >int> num, den;> public>:> >Fraction(>int> n,>int> d)> >{> >num = n;> >den = d;> >}> >// Conversion operator: return float value of fraction> >operator>float>()>const> >{> >return> float>(num) />float>(den);> >}> };> int> main()> {> >Fraction f(2, 5);> >float> val = f;> >cout << val <<>'
'>;> >return> 0;> }> |
>
>Izvade
0.4>
Pārslogotiem konvertēšanas operatoriem ir jābūt dalības metodei. Citi operatori var būt vai nu dalības metode, vai globālā metode.
4) Jebkurš konstruktors, ko var izsaukt ar vienu argumentu, darbojas kā konversijas konstruktors, kas nozīmē, ka to var izmantot arī netiešai konvertēšanai uz konstruējamo klasi.
Piemērs:
virkne konvertēt uz int java
C++
// C++ program to demonstrate can also be used for implicit> // conversion to the class being constructed> #include> using> namespace> std;> class> Point {> private>:> >int> x, y;> public>:> >Point(>int> i = 0,>int> j = 0)> >{> >x = i;> >y = j;> >}> >void> print()> >{> >cout <<>'x = '> << x <<>', y = '> << y <<>'
'>;> >}> };> int> main()> {> >Point t(20, 20);> >t.print();> >t = 30;>// Member x of t becomes 30> >t.print();> >return> 0;> }> |
>
>Izvade
x = 20, y = 20 x = 30, y = 0>
Viktorīna par operatora pārslodzi