Přetížení operátora C ++ (s příklady)

V tomto výukovém programu se na příkladech seznámíme s přetížením operátorů.

V C ++ můžeme změnit způsob, jakým operátoři pracují pro uživatelem definované typy, jako jsou objekty a struktury. Toto se nazývá přetížení operátora . Například,

Předpokládejme, že jsme vytvořili tři objekty c1, c2 a jsou výsledkem třídy s názvem, Complexkterá představuje komplexní čísla.

Vzhledem k tomu, že přetížení operátora nám umožňuje změnit způsob práce operátorů, můžeme předefinovat, jak +operátor funguje, a použít jej k přidání komplexních čísel c1 a c2 napsáním následujícího kódu:

 result = c1 + c2;

místo něčeho jako

 result = c1.addNumbers(c2);

Díky tomu je náš kód intuitivní a snadno srozumitelný.

Poznámka: Nemůžeme použít operátor přetížení základních datových typů, jako jsou int, float, chara tak dále.

Syntaxe pro přetížení operátora C ++

K přetížení operátora používáme speciální operatorfunkci.

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

Tady,

  • returnType je návratový typ funkce.
  • operator je klíčové slovo.
  • symbolje operátor, kterého chceme přetížit. Jako jsou: +, <, -, ++, atd.
  • arguments jsou argumenty předané funkci.

Přetížení operátora u unárních operátorů

Unární operátoři pracují pouze s jedním operandem. Inkrementální operátor ++a operátor dekrementace --jsou příklady unárních operátorů.

Příklad 1: ++ Přetížení operátoru (unární operátor)

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

Výstup

 Počet: 6

Tady, když použijeme ++count1;, void operator ++ ()se volá. Tím se zvyšuje atribut hodnoty pro počet objektů1 o 1.

Poznámka: Když přetížíme operátory, můžeme to použít k práci jakýmkoli způsobem. Mohli jsme například použít ++ke zvýšení hodnoty o 100.

Díky tomu je náš kód matoucí a obtížně srozumitelný. Naším úkolem jako programátora je používat přetížení operátora správně a konzistentně a intuitivně.

Výše uvedený příklad funguje, pouze pokud ++je použit jako předpona. Abychom ++fungovali jako postfix, používáme tuto syntaxi.

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

Všimněte si intuvnitř závorek. Je to syntaxe používaná pro použití unárních operátorů jako postfix; není to funkční parametr.

Příklad 2: Přetížení operátoru ++ (unární operátor)

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

Výstup

 Počet: 6 Počet: 7

Příklad 2 funguje, když ++se používá jak jako prefix a postfix. Nefunguje to však, pokud se pokusíme udělat něco takového:

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

Je to proto, že návratový typ naší funkce operátora je void. Tento problém můžeme vyřešit tak, že Countjako návratový typ použijeme operátorskou funkci.

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

Příklad 3: Návratová hodnota z funkce operátora (++ operátor)

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

Výstup

 Počet: 6 Počet: 7

Zde jsme použili následující kód pro přetížení operátoru předpony:

 // 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 pro přetížení operátoru postfix je také stejný. Všimněte si, že jsme vytvořili dočasnou teplotu objektu a vrátili jeho hodnotu operátorské funkci.

Všimněte si také kódu

 temp.value = ++value; 

Hodnota proměnné patří k objektu count1, main()protože count1 volá funkci, zatímco temp.value patří k dočasnému objektu.

Přetížení operátora u binárních operátorů

Binární operátory pracují na dvou operandech. Například,

 result = num + 9;

Tady +je binární operátor, který pracuje na operandech num a 9.

Když přetížíme binární operátor pro uživatelem definované typy pomocí kódu:

 obj3 = obj1 + obj2;

Funkce operátoru se volá pomocí objektu obj1 a obj2 se předá funkci jako argument.

Příklad 4: Přetížení binárního operátoru 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; )

Výstup

 Zadejte první komplexní číslo: Zadejte skutečné a imaginární části: 9 5 Zadejte druhé komplexní číslo: Zadejte skutečné a imaginární části: 7 6 Výstupní komplexní číslo: 16 + 11i

V tomto programu je funkce operátora:

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

Místo toho jsme také mohli napsat tuto funkci jako:

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

Nicméně,

  • using &dělá náš kód efektivní odkazem na objekt complex2 namísto vytváření duplicitního objektu uvnitř funkce operátoru.
  • použití constje považováno za dobrou praxi, protože brání operátorské funkci v úpravě komplexu2.
Přetížení binárních operátorů v C ++

Na co je třeba pamatovat při přetížení operátora v C ++

  1. Dva operátoři =a &jsou již ve výchozím nastavení v C ++ přetíženi. Například pro kopírování objektů stejné třídy můžeme přímo použít =operátor. Nepotřebujeme vytvářet operátorskou funkci.
  2. Přetížení operátoru nemůže změnit prioritu a asociativitu operátorů. Pokud však chceme změnit pořadí hodnocení, měli bychom použít závorky.
  3. V C ++ nelze přetížit 4 operátory. Oni jsou:
    1. :: (rozlišení rozsahu)
    2. . (výběr členů)
    3. .* (výběr členů pomocí ukazatele na funkci)
    4. ?: (ternární operátor)

Na těchto stránkách se dozvíte více o:

  • Jak správně přetížit operátor přírůstku?
  • Jak přetížit binární operátor - odečíst komplexní čísla?

Zajímavé články...