Преклапање оператора у програмском језику C++

За већину стандардних оператора могу се дефинисати нова тумачења за операнде класних типова, што омогућава писање израза на исти начин као за операнде стандардних типова. C++ дозвољава преклапање оператора (operator overloading), као што дозвољава и преклапање имена функција. Принцип преклапања омогућава да се дефинишу нова значења оператора за корисничке типове, осим за операторе:

. – приступ члану класе
:: – разрешење досега
?: – условни израз
sizeof – величина објекта
throw – пријављивање изузетака

Ограничења:

  • не могу да се редефинишу значења оператора за стандардне типове података
  • не могу да се уводе нови симболи за операторе
  • не могу да се мењају особине оператора: приоритет и смер груписања

Операторске функције

У језику C++, оператори за корисничке типове (класе) су специјалне операторске функције. Операторске функције носе име operator@, где је @ неки оператор уграђен у језик. Операторске функције преклапају стандарадне операторе (+, -, *, /, …). Операторске функције се могу користити у изразима као и оператори над уграђеним типовима. Ако се симбол оператора састоји од слова (нпр new), мора се писати одвојено од кључне речи operator, иначе се може писати спојено.

Операторске функције могу бити:

1.   методе код којих је скривени аргумент леви операнд или
2.   глобалне функције (углавном пријатељске функције) код којих је бар један аргумент типа корисничке класе.

За корисничке типове су унапред дефинисана три оператора:
= (додела вредности),
& (узимање адресе) и
, (ланчање).
Све док их корисник не редефинише, они имају подразумевано значење.

Преклапање оператора за доделу вредности (оператор =)

Подразумевано значење оператора = је копирање објекта члан по члан. При копирању чланова типа класе, позивају се оператори = класа којима чланови припадају. Ако је члан објекта показивач, копираће се само тај показивач, а не и показивана вредност. Када треба копирати и објекат на који указује члан-показивач корисник тада треба да редефинише оператор =. Ово је слично као и код конструктора конверзије – у класама са показивачким пољима мора се дефинисати конструктор копије и редефинисати оператор доделе вредности! Вредности операторских функција могу да буду било ког типа, па и void.

Операторске функције као чланице или као глобалне функције

Ако је @ неки бинарни оператор (на пример +), он може да се реализује:
1.   Као метода  класе X: <tip> operator@ (X)
Позив a@b се сада тумачи као: a.operator@(b)
2.   као пријатељска глобална функција: <tip> operator@ (X,X)
Позив a@b се сада тумачи као: operator@(a,b)

Код операторске функције која је реализована као метода класе леви операнд је скривени аргумент – објекат дате класе (текући објекат).
Ако леви операнд треба да буде стандардног типа мора се дефинисати пријатељска функција у класи другог аргумента.
На пример: Complex operator-(double d, Complex c) мора бити пријатељска, зато што метода не дозвољава конверзију левог операнда.

Унарни и бинарни оператори

Унарни оператор има само један операнд, па се може реализовати:
1.   Као метода  класе без аргумената: tip operator@ ()
2.   као глобална функција са једним аргументом: tip operator@ (X x)

Бинарни оператор има два аргумента, па се може реализовати
1.   Као метода  класе са једним аргументом: tip operator@ (X xdesni)
2.   као глобална функција са два аргумента: tip operator@ (X xlevi, X xdesni)

Операторске функције не могу да имају параметре са подразумеваним вредностима аргумената, не могу бити заједничке методе (static).

Пример:

class T
{
…
public:
T1 operator- ();                  // unarni – kao metoda
friend T2 operator! (T a);        // unarni ! Kao prijateljska funkcija
T3 operator+ (T4 b);              // binarni + kao metoda
friend T5 operator* (T a, T6 b);  // binarni * kao prijateljska funkcija
friend T7 operator/ (T8 a, T b);  // binarni / kao prijateljska funkcija
…
};
T t; T4 x; T6 y; T8 z;
T1 a=-t;                          // a=t.operator-();
T2 b=!t;                          // b=operator!(y);
T3 c=t+x;                         // c=t.operator+(x);
T5 d=t*y;                         // d=operator*(t,y);
T7 e=z/t;                         // e=operator/(z,t);
Advertisements

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се / Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се / Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се / Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се / Промени )

Повезивање са %s