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, Complex
která 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
, char
a tak dále.
Syntaxe pro přetížení operátora C ++
K přetížení operátora používáme speciální operator
funkci.
class className (… public returnType operator symbol (arguments) (… )… );
Tady,
returnType
je návratový typ funkce.- operator je klíčové slovo.
symbol
je 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 int
uvnitř 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 Count
jako 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í
const
je považováno za dobrou praxi, protože brání operátorské funkci v úpravě komplexu2.

Na co je třeba pamatovat při přetížení operátora v C ++
- 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. - 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.
- V C ++ nelze přetížit 4 operátory. Oni jsou:
::
(rozlišení rozsahu).
(výběr členů).*
(výběr členů pomocí ukazatele na funkci)?:
(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?