У овом упутству ћемо научити о преоптерећењу оператора помоћу примера.
У Ц ++-у можемо променити начин на који оператори раде за кориснички дефинисане типове попут објеката и структура. Ово је познато као преоптерећење оператера . На пример,
Претпоставимо да смо креирали три објекта ц1, ц2 и да су резултат класе назване Complex
која представља комплексне бројеве.
Будући да нам преоптерећеност оператора омогућава да променимо начин на који оператори раде, можемо редефинисати начин рада +
оператора и користити га за додавање сложених бројева ц1 и ц2 писањем следећег кода:
result = c1 + c2;
уместо нечег сличног
result = c1.addNumbers(c2);
Ово чини наш код интуитивним и лаким за разумевање.
Напомена: Не можете да користите оператор преоптерећења основних типова података, као што су int
, float
, char
и тако даље.
Синтакса за преоптерећење оператора Ц ++
Да бисмо преоптеретили оператора, користимо посебну operator
функцију.
class className (… public returnType operator symbol (arguments) (… )… );
Ево,
returnType
је повратни тип функције.- оператор је кључна реч.
symbol
је оператор којег желимо преоптеретити. Као што су:+
,<
,-
,++
, итдarguments
је аргументи прослеђени функцији.
Преоптерећење оператора у Унари Операторима
Унарни оператори оперишу само на једном операнду. Оператор прираштаја и оператор ++
смањења --
су примери унарних оператора.
Пример1: ++ Преоптерећење оператора (Унари Оператор)
// 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; )
Оутпут
Тачка: 6
Овде, када користимо ++count1;
, void operator ++ ()
зове се. Ово повећава атрибут вредности за објект цоунт1 за 1.
Напомена: Када преоптеретимо операторе, можемо да га користимо за рад на било који начин који желимо. На пример, могли смо ++
да повећамо вредност за 100.
Међутим, ово чини наш код збуњујућим и тешко разумљивим. Наш посао као програмера је да правилно и доследно и интуитивно користимо преоптерећење оператера.
Горњи пример делује само када ++
се користи као префикс. Да бисмо ++
радили као постфикс, користимо ову синтаксу.
void operator ++ (int) ( // code )
Обратите пажњу на int
унутрашњу заграду. То је синтакса која се користи за употребу унарних оператора као постфикса; то није параметар функције.
Пример 2: ++ Оператор (Унари Оператор) Преоптерећење
// 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; )
Оутпут
Број: 6 Број: 7
Пример 2 ради када ++
се користи и као префикс и постфик. Међутим, то не функционише ако покушамо да урадимо нешто попут овог:
Count count1, result; // Error result = ++count1;
То је зато што је тип повратка наше функције оператора void
. Овај проблем можемо решити тако што ћемо Count
као повратни тип извршити функцију оператора.
// return Count when ++ used as prefix Count operator ++ () ( // code ) // return Count when ++ used as postfix Count operator ++ (int) ( // code )
Пример 3: Повратна вредност из функције оператора (++ Оператор)
#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; )
Оутпут
Број: 6 Број: 7
Овде смо користили следећи код за преоптерећење оператора префикса:
// Overload ++ when used as prefix Count operator ++ () ( Count temp; // Here, value is the value attribute of the calling object temp.value = ++value; return temp; )
И код за преоптерећење оператора постфикса је исти. Приметите да смо креирали темп објекта и вратили његову вредност функцији оператора.
Обратите пажњу и на шифру
temp.value = ++value;
Вредност променљиве припада објекту цоунт1 main()
зато што цоунт1 позива функцију, док темп.валуе припада темп објекту.
Преоптерећење оператора у бинарним операторима
Бинарни оператори раде на два операнда. На пример,
result = num + 9;
Овде +
је бинарни оператор који ради на операндима нум и 9
.
Када преоптеретимо бинарни оператор за кориснички дефинисане типове помоћу кода:
obj3 = obj1 + obj2;
Операторска функција се позива помоћу обј1 објекта и обј2 се предаје као аргумент функцији.
Пример 4: Преоптерећење бинарног оператора Ц ++
// 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; )
Оутпут
Унесите први комплексни број: Унесите реални и замишљени део: 9 5 Унесите други комплексни број: Унесите стварни и замишљени део: 7 6 Излазни комплексни број: 16 + 11и
У овом програму, оператерска функција је:
Complex operator + (const Complex& obj) ( // code )
Уместо овога, могли смо да напишемо и ову функцију као:
Complex operator + (Complex obj) ( // code )
Међутим,
- Коришћење
&
чини наш код ефикасним позивањем на комплекс2 објекта уместо да се направи дупликат објекта унутар функције оператора. - употреба
const
се сматра добром праксом јер спречава функцију оператора да модификује комплекс2.

Ствари које треба запамтити у преоптерећењу оператора Ц ++
- Два оператора
=
и&
већ су подразумевано преоптерећени у Ц ++. На пример, да бисмо копирали објекте исте класе, можемо директно да користимо=
оператор. Не треба да креирамо функцију оператора. - Преоптерећење оператора не може променити приоритет и асоцијативност оператора. Међутим, ако желимо да променимо редослед оцењивања, треба користити заграде.
- Постоје 4 оператора која се у Ц ++ не могу преоптеретити. Су:
::
(резолуција опсега).
(избор чланова).*
(избор члана кроз показивач на функцију)?:
(тернарни оператер)
Посетите ове странице да бисте сазнали више о:
- Како преоптеретити оператор повећања на прави начин?
- Како преоптеретити бинарни оператор - одузети сложене бројеве?