Preobremenitev operaterja C ++ (s primeri)

V tej vadnici bomo s pomočjo primerov spoznali preobremenitev operaterja.

V jeziku C ++ lahko spremenimo način delovanja operaterjev za uporabniško določene vrste, kot so predmeti in strukture. To je znano kot preobremenitev operaterja . Na primer

Recimo, da smo ustvarili tri predmete c1, c2 in izhajajo iz razreda z imenom, Complexki predstavlja kompleksna števila.

Ker nam preobremenitev operaterja omogoča spreminjanje načina delovanja operaterjev, lahko na novo določimo, kako +deluje, in z njim dodamo kompleksna števila c1 in c2, tako da napišemo naslednjo kodo:

 result = c1 + c2;

namesto česa takega

 result = c1.addNumbers(c2);

Zaradi tega je naša koda intuitivna in enostavna za razumevanje.

Opomba: Ne moremo uporabiti operaterja preobremenitve temeljnih vrste podatkov, kot so int, float, charin tako naprej.

Sintaksa za preobremenitev operaterja C ++

Za preobremenitev operaterja uporabimo posebno operatorfunkcijo.

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

Tukaj,

  • returnType je vrsta vrnitve funkcije.
  • operator je ključna beseda.
  • symbolje operater, ki ga želimo preobremeniti. Kot so: +, <, -, ++, itd
  • arguments so argumenti, posredovani funkciji.

Preobremenitev operaterja v enoličnih operaterjih

Unarski operaterji delujejo samo na enem operandu. Operator prirastka ++in pomanjševalec --sta primera enoličnih operatorjev.

Primer1: Preobremenitev operaterja ++ (Unary Operator)

 // 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; )

Izhod

 Štetje: 6

Tukaj, ko uporabljamo ++count1;, void operator ++ ()se imenuje. To poveča atribut vrednosti za objekt count1 za 1.

Opomba: Ko operaterje preobremenimo, lahko z njim delujemo na kakršen koli način. Na primer, vrednost bi lahko ++povečali za 100.

Vendar je naša koda zmedena in težko razumljiva. Naša naloga kot programerja je, da pravilno in dosledno ter intuitivno uporabljamo preobremenitev operaterja.

Zgornji primer deluje samo, če ++se uporablja kot predpona. Za ++delo kot postfix uporabljamo to sintakso.

 void operator ++ (int) ( // code )

Upoštevajte intnotranjo oklepaje. To je sintaksa, ki se uporablja za uporabo unarskih operatorjev kot postfix; to ni funkcijski parameter.

Primer 2: Preobremenitev operaterja ++ (Unary Operator)

 // 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; )

Izhod

 Štetje: 6 Število: 7

Primer 2 deluje, ko ++je uporabljal kot predpono in postfiksom. Vendar ne deluje, če poskušamo narediti kaj takega:

 Count count1, result; // Error result = ++count1;

To je zato, ker je vrsta vrnitve naše funkcije operaterja void. To težavo lahko rešimo tako, da Countkot vrnitev vrnemo funkcijo operatorja.

 // return Count when ++ used as prefix Count operator ++ () ( // code ) // return Count when ++ used as postfix Count operator ++ (int) ( // code )

Primer 3: Vrnjena vrednost iz funkcije operaterja (operater ++)

 #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; )

Izhod

 Štetje: 6 Število: 7

Tu smo za preobremenitev operaterja predpone uporabili naslednjo kodo:

 // Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; )

Tudi koda za preobremenitev operaterja postfix je enaka. Upoštevajte, da smo ustvarili temp predmeta in vrnili njegovo vrednost v funkcijo operatorja.

Upoštevajte tudi kodo

 temp.value = ++value; 

Vrednost spremenljivke pripada objektu count1, main()ker count1 prikliče funkcijo, medtem ko temp.value pripada predmetu temp.

Preobremenitev operaterja v binarnih operaterjih

Binarni operaterji delajo na dveh operandih. Na primer

 result = num + 9;

Tu +je binarni operator, ki deluje na operandi num in 9.

Ko z uporabo kode preobremenimo binarni operator za uporabniško določene tipe:

 obj3 = obj1 + obj2;

Operatorska funkcija se pokliče z uporabo predmeta obj1 in obj2 se posreduje kot argument funkciji.

Primer 4: Preobremenitev binarnega operaterja C ++

 // 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; )

Izhod

 Vnesite prvo kompleksno številko: Vnesite resnične oziroma namišljene dele: 9 5 Vnesite drugo kompleksno številko: Vnesite resnične in namišljene dele: 7 6 Izhodno kompleksno število: 16 + 11i

V tem programu je uporabniška funkcija:

 Complex operator + (const Complex& obj) ( // code )

Namesto tega bi lahko tudi napisali to funkcijo, kot je:

 Complex operator + (Complex obj) ( // code )

Vendar

  • Uporaba &naredi našo kodo učinkovito tako, da se sklicuje na objekt complex2, namesto da bi naredil dvojnik v operacijski funkciji.
  • uporaba constse šteje za dobro prakso, ker preprečuje, da bi funkcija operatorja spreminjala kompleks2.
Preobremenitev binarnih operaterjev v jeziku C ++

Stvari, ki si jih je treba zapomniti pri preobremenitvi operaterja C ++

  1. Dva operaterja =in &sta v C ++ že privzeto preobremenjena. Na primer, za kopiranje predmetov istega razreda lahko neposredno uporabimo =operator. Ni nam treba ustvariti funkcije operaterja.
  2. Preobremenitev operaterja ne more spremeniti prednosti in asociativnosti operaterjev. Če pa želimo spremeniti vrstni red ocenjevanja, uporabite oklepaje.
  3. Obstajajo 4 operaterji, ki jih v C ++ ni mogoče preobremeniti. To so:
    1. :: (ločljivost obsega)
    2. . (izbor članov)
    3. .* (izbor člana prek kazalca na funkcijo)
    4. ?: (trikotni operater)

Obiščite te strani, če želite izvedeti več o:

  • Kako preobremeniti operator povečanja na pravi način?
  • Kako preobremeniti binarni operater - odšteti kompleksna števila?

Zanimive Članki...