У овом примеру ћете научити да преоптеретите операторе инкремента ++ и децремент-а у Ц ++.
Да бисте разумели овај пример, требало би да имате знање о следећим темама програмирања на Ц ++:
- Ц ++ класе и објекти
- Ц ++ конструктори
- Преоптерећење оператора Ц ++
У овом упутству, инкремент ++ и декременти - оператор су преоптерећени на најбољи могући начин, тј. Повећати вредност члана података за 1 ако ++ оператор оперише на објекту и смањити вредност члана података за 1 иф - оператор се користи.
Пример 1: Преоптерећење оператора повећања префикса ++ без типа повратка
#include using namespace std; class Check ( private: int i; public: Check(): i(0) ( ) void operator ++() ( ++i; ) void Display() ( cout << "i=" << i << endl; ) ); int main() ( Check obj; // Displays the value of data member i for object obj obj.Display(); // Invokes operator function void operator ++( ) ++obj; // Displays the value of data member i for object obj obj.Display(); return 0; )
Оутпут
и = 0 и = 1
У почетку када се декларише објект обј, вредност члана података и за објекат обј је 0 (конструктор иницијализује и на 0).
Када се ++ оператором управља на обј, void operator++( )
позива се функција оператора која повећава вредност члана података и на 1.
Овај програм није потпун у смислу да не можете користити коришћени код:
обј1 = ++ обј;
То је зато што је повратни тип функције оператора у горе наведеном програму неважећи.
Ево мале модификације горњег програма тако да можете користити код obj1 = ++obj
.
Пример 2: Преоптерећење оператора повећања префикса ++ са типом повратка
#include using namespace std; class Check ( private: int i; public: Check(): i(0) ( ) // Return type is Check Check operator ++() ( Check temp; ++i; temp.i = i; return temp; ) void Display() ( cout << "i = " << i << endl; ) ); int main() ( Check obj, obj1; obj.Display(); obj1.Display(); obj1 = ++obj; obj.Display(); obj1.Display(); return 0; )
Оутпут
и = 0 и = 0 и = 1 и = 1
Овај програм је сличан оном горе.
Једина разлика је у томе што је повратни тип функције оператора Цхецк у овом случају који омогућава употребу оба кода ++obj;
obj1 = ++obj;
. То је зато што се темп враћен из функције оператора чува у објекту обј.
Будући да је повратни тип функције оператора Цхецк, такође можете доделити вредност обј другом објекту.
Приметите да = (оператор додељивања) не треба преоптеретити јер је овај оператор већ преоптерећен у библиотеци Ц ++.
Пример 3: Постфик Инцремент ++ Оператор Оверлоадинг
Преоптерећење инкременталног оператора до ове тачке је тачно само ако се користи у облику префикса.
Ово је модификација горњег програма како би ово функционисало и за префикс и за постфикс.
#include using namespace std; class Check ( private: int i; public: Check(): i(0) ( ) Check operator ++ () ( Check temp; temp.i = ++i; return temp; ) // Notice int inside barcket which indicates postfix increment. Check operator ++ (int) ( Check temp; temp.i = i++; return temp; ) void Display() ( cout << "i = "<< i <
Output
i = 0 i = 0 i = 1 i = 1 i = 2 i = 1
When increment operator is overloaded in prefix form;
Check operator ++ ()
is called but, when increment operator is overloaded in postfix form; Check operator ++ (int)
is invoked.
Notice, the int inside bracket. This int gives information to the compiler that it is the postfix version of operator.
Don't confuse this int doesn't indicate integer.
Example 4: Operator Overloading of Decrement -- Operator
Decrement operator can be overloaded in similar way as increment operator.
#include using namespace std; class Check ( private: int i; public: Check(): i(3) ( ) Check operator -- () ( Check temp; temp.i = --i; return temp; ) // Notice int inside barcket which indicates postfix decrement. Check operator -- (int) ( Check temp; temp.i = i--; return temp; ) void Display() ( cout << "i = "<< i <
Output
i = 3 i = 3 i = 2 i = 2 i = 1 i = 2
Also, unary operators like: !, ~ etc can be overloaded in similar manner.