У овом упутству ћемо научити о преоптерећењу оператора помоћу примера.
У Ц ++-у можемо променити начин на који оператори раде за кориснички дефинисане типове попут објеката и структура. Ово је познато као преоптерећење оператера . На пример,
Претпоставимо да смо креирали три објекта ц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 оператора која се у Ц ++ не могу преоптеретити. Су:
::(резолуција опсега).(избор чланова).*(избор члана кроз показивач на функцију)?:(тернарни оператер)
Посетите ове странице да бисте сазнали више о:
- Како преоптеретити оператор повећања на прави начин?
- Како преоптеретити бинарни оператор - одузети сложене бројеве?








