Преоптерећење оператора Ц ++ (са примерима)

У овом упутству ћемо научити о преоптерећењу оператора помоћу примера.

У Ц ++-у можемо променити начин на који оператори раде за кориснички дефинисане типове попут објеката и структура. Ово је познато као преоптерећење оператера . На пример,

Претпоставимо да смо креирали три објекта ц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.
Преоптерећење бинарних оператора у Ц ++

Ствари које треба запамтити у преоптерећењу оператора Ц ++

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

Посетите ове странице да бисте сазнали више о:

  • Како преоптеретити оператор повећања на прави начин?
  • Како преоптеретити бинарни оператор - одузети сложене бројеве?

Занимљиви Чланци...