You are on page 1of 4

Оператори

Сврха оператора
У објектно оријентисаном програмском језику као што је C#, преоптерећење оператора
пружа много природнији начин имплементације операција на произвољним типовима као што су
класе. Претпоставимо да имамо класу која представља рационални или комплексни број и
желимо да са објектима ове класе извршавамо све аритметичке операције. Један од начина за
то је да направимо функције као што су Dodaj и Pomnozi у оквиру класе и тиме обезбедимо ову
функционалност. Употреба ових метода класе би изгледала овако:

RacionalanBroj rbRezultat = rbOperand1.Dodaj(rbOperand2);


RacionalanBroj rbRezultat = RacionalanBroj.Pomnozi(rbOperand1, rbOperand2);
RacionalanBroj rbRezultat = rbOperand1.Dodaj(rbOperand2.Pomnozi(rbOperand3));

Позив на овај начин дефинисаних метода је гломазан и неприродан за запис проблема који
треба решити. Било би много лакше имати оператор + за операцију додавања и оператер * за
производ као код простих типова података. Други начин је да направимо преоптерећене верзије
оператора који важе за задату класу, као што су operator + и operator *, који ће се користити за
овај тип података. Следећи пример показује како изгледа употреба оператора:

RacionalanBroj rbRezultat = rbOperand1 + rbOperand2;


RacionalanBroj rbRezultat = rbOperand1 * rbOperand2;
RacionalanBroj rbRezultat = rbOperand1 + rbOperand2 * rbOperand3;

Преоптерећење оператoра пружа много природнији начин записа ових операција за овакве
типове података (класе). Овакав запис је много елегантнији и лакши за рад. За један позив
оператора, може се тврдити да количина рада за имплементацију првог или другог начина, тј.
једне синтаксе у односу на другу, приближно иста. Међутим, када се повезују више
математичких операција, синтакса која користи операторе је много једноставнија. Поред тога,
ако су најважнији корисници новог типа података (класе) математичари и научници, оператори
су интуитивнији и природнији.

Типови оператора који се могу преоптеретити су: унарни оператери, бинарни оператери,
релациони оператери, логички оператори, оператори индексирања и оператори конверзије.

Међутим, није могуће преоптерећење свих оператера, већ постоје ограничења која су наведена у следећој табели:

Оператори Могућност преоптерећења


+, -, !, ~, ++, --, true, false Ови унарни оператери могу бити преоптерећени.

+, -, *, /, %, &, |, ^, Ови бинарни оператери могу бити


<<, >> преоптерећени.

==, !=, <, >, Оператори упоређивања могу бити


<=, >= преоптерећени (али
погледајте напомену испод ове табеле).

Логички оператери не могу бити преоптерећени,


&&, || али се
њихов резултат добија користећи & и |, који се
могу
преоптеретити.

[] Оператор индексирања поља не може бити


преоптерећен, али је могуће дефинисати
индексер.

(T)x Оператор промене типа (cast) не може бити


преоптерећен, али је могуће дефинисати
операторе
конверзије (explicit и implicit).

+=, -=, *=, /=, %=, &=, |=, ^=, <<=, Оператори доделе не могу бити преоптерећени,
>>= али се
на пример, резултат оператор += добија
користећи
оператор +, који се може преоптерети.

=, ., ?:, ??, ->, =>, f(x), as,


checked, Ови оператери не могу бити преоптерећени.
unchecked, default, delegate, is,
new,
sizeof, typeof
Напомена: Оператори упоређивања, ако су преоптерећени, морају бити
преоптерећени у паровима; ако је оператор == преоптерећен, онда оператор !=
такође мора бити преоптерећен. Обрнуто је такође важи. Слично важи и за
операторе < и > и за операторе <= и >=

За преоптерећење оператера неке класe потребно је направити методе класе


са правилним потписом. Метод мора бити назван operator #, где # представља
име или симбол оператора (неког из претходне табеле) који је преоптерећен.
Унарни оператори морају имати само један параметар, а бинарни оператори
морају имати два параметра. У сваком случају, један параметар оператора
мора бити истог типа као и класа или структура за коју се декларише тај
оператор.

Правила којих се треба придржавати приликом прављења преоптерећених


оператора су следећа:
1. Функција оператор би требала бити функција чланица класе за
коју се оператор декларише.
2. Функција оператор мора бити декларисана као
статичка (static).
3. Аргументи функције су операнди.
4. Повратна вредност функције је резултат ове операције.
Оператор је статичка метода, што је једини начин на који се може и
треба декларисати јер оператор припада типу података (класи), а не
некој конкретној инстанци класе (објекту).

Преоптерећење бинарних оператора


Бинарни оператор је метод који има 2 параметра и враћа нови објекат типа
података (класе) којој оператор припада.
Некада је потребно имати могућност аритметике између новог типа података
(класе) и неког уграђеног (простог) типа. Ако постоји потреба за сабирањем
рационалним бројем са неким целобројним податком онда ћемо морати да
направимо преоптерећене функције са одговарајућим типовима параметара.

Важно је напоменути да када тип података (класа) има бинарни оператор


(оператор +) имплементиран сложени оператор доделе који укључује тај
оператор (оператор +=) је аутоматски имплементиран и користи тело овог
оператора (оператор +).

Преоптерећење унарних оператора


Унарни оператор је метод који има један параметар који одговара типу података
(класи) којој оператор припада. Важна ствар у случају преоптерећења унарних
оператора јесте да они не треба да мењају вредност објекта који им се преноси
као параметар и врате овај промењени објекат, већ треба да направе нови
објекат.
Треба приметити да је довољно направити преоптерећени оператор ++ док
ће се C# интерно побринути о томе да га правилно искористи за
имплементацију префиксног и постфиксног оператора.

Преоптерећење релационих оператора


Релациони оператори, као што су < и >, такође могу бити преоптерећени као
методи са два параметра. Важно је напоменути да је потребно преоптерећивати
релационе операторе у паровима тј. сам оператор и његов супротни оператор (ако
је преоптерећен оператор < онда је неопходно преоптерети оператор >). Исто
важи и за парове оператора (<=,> =) и (==,! =).

You might also like