Preopterećenje operatora C ++ (s primjerima)

U ovom uputstvu uz primjere ćemo naučiti o preopterećenju operatera.

U C ++-u možemo promijeniti način rada operatora za korisnički definirane tipove poput objekata i struktura. To je poznato kao preopterećenje operatera . Na primjer,

Pretpostavimo da smo kreirali tri objekta c1, c2 i da su rezultat klase imenovane Complexkoja predstavlja kompleksne brojeve.

Budući da nam preopterećenje operatora omogućuje promjenu načina rada operatora, možemo redefinirati način rada +operatora i upotrijebiti ga za dodavanje složenih brojeva c1 i c2 napisivanjem sljedećeg koda:

 result = c1 + c2;

umjesto nečega poput

 result = c1.addNumbers(c2);

To čini naš kod intuitivnim i lako razumljivim.

Napomena: Ne možete koristiti operator preopterećenja temeljnih tipova podataka kao što su int, float, chari tako dalje.

Sintaksa za preopterećenje operatora C ++

Da bismo preopteretili operatora, koristimo posebnu operatorfunkciju.

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

Ovdje,

  • returnType je povratni tip funkcije.
  • operator je ključna riječ.
  • symbolje operator kojeg želimo preopteretiti. Kao što su: +, <, -, ++, itd
  • arguments je argumenti proslijeđeni funkciji.

Preopterećenje operatora u unarnim operatorima

Unarni operatori operiraju samo na jednom operandu. Operator ++priraštaja i operator smanjenja --primjeri su unarnih operatora.

Primjer1: ++ Preopterećenje operatora (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; )

Izlaz

 Broj: 6

Ovdje, kada koristimo ++count1;, void operator ++ ()tzv. To povećava atribut vrijednosti za objekt count1 za 1.

Napomena: Kada preopteretimo operatore, možemo ga koristiti za rad na bilo koji način koji želimo. Na primjer, mogli smo ++povećati vrijednost za 100.

Međutim, to naš kod čini zbunjujućim i teško razumljivim. Naš je posao programera koristiti preopterećenje operatera ispravno i na dosljedan i intuitivan način.

Gornji primjer djeluje samo kada ++se koristi kao prefiks. Da bismo ++radili kao postfix, koristimo ovu sintaksu.

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

Obratite pažnju na intunutarnju zagradu. To je sintaksa koja se koristi za upotrebu unarnih operatora kao postfiksa; to nije parametar funkcije.

Primjer 2: ++ Operator (Unary Operator) Preopterećenje

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

Izlaz

 Broj: 6 Broj: 7

Primjer 2 radi kada ++se koristi i kao prefiks i postfix. Međutim, to ne uspije ako pokušamo napraviti nešto poput ovoga:

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

To je zato što je vrsta povrata naše funkcije operatora void. Ovaj problem možemo riješiti izradom Counttipa povrata funkcije operatora.

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

Primjer 3: Povratna vrijednost iz funkcije operatora (++ Operator)

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

Izlaz

 Broj: 6 Broj: 7

Ovdje smo koristili sljedeći kod za preopterećenje operatora prefiksa:

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

Kôd za preopterećenje operatora postfiksa također je isti. Primijetite da smo stvorili temp objekta i vratili njegovu vrijednost funkciji operatora.

Također primijetite kod

 temp.value = ++value; 

Vrijednost varijable pripada objektu main()count1 u jer count1 poziva funkciju, dok temp.value pripada temp objektu.

Preopterećenje operatora u binarnim operatorima

Binarni operatori rade na dva operanda. Na primjer,

 result = num + 9;

Ovdje +je binarni operator koji radi na operandima num i 9.

Kada preopteretimo binarni operator za korisnički definirane tipove pomoću koda:

 obj3 = obj1 + obj2;

Funkcija operatora poziva se pomoću objekta obj1, a obj2 se prosljeđuje kao argument funkciji.

Primjer 4: Preopterećenje binarnog operatora 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; )

Izlaz

 Unesite prvi kompleksni broj: Unesite stvarni, odnosno imaginarni dijelovi: 9 5 Unesite drugi kompleksni broj: Unesite stvarni, odnosno imaginarni dijelovi: 7 6 Izlazni kompleksni broj: 16 + 11i

U ovom programu operacijska funkcija je:

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

Umjesto ovoga, mogli smo napisati i ovu funkciju poput:

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

Međutim,

  • Korištenje &čini naš kod učinkovitim referenciranjem objekta complex2 umjesto izrade dupliciranog objekta unutar funkcije operatora.
  • Korištenje constse smatra dobrom praksom jer sprečava funkciju operatora da modificira kompleks2.
Preopterećenje binarnih operatora u C ++

Stvari koje treba zapamtiti u preopterećenju operatora C ++

  1. Dva operatora =i &već su preopterećeni prema zadanim postavkama u C ++. Na primjer, za kopiranje objekata iste klase možemo izravno koristiti =operator. Ne trebamo stvarati funkciju operatora.
  2. Preopterećenje operatora ne može promijeniti prioritet i asocijativnost operatora. Međutim, ako želimo promijeniti redoslijed vrednovanja, trebaju se koristiti zagrade.
  3. Postoje 4 operatora koja se u C ++ ne mogu preopteretiti. Oni su:
    1. :: (razlučivost opsega)
    2. . (odabir člana)
    3. .* (odabir člana kroz pokazivač na funkciju)
    4. ?: (trokraki operater)

Posjetite ove stranice da biste saznali više o:

  • Kako preopteretiti operator povećanja na pravi način?
  • Kako preopteretiti binarni operator - oduzeti složene brojeve?

Zanimljivi članci...