![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Операторларды қайта анықтау.
С++ тілінде стандартты анық талатын типтерге қ олданылатын операторлар кірістірілген болып табылады. Яғ ни программист бұ л оператордың орындалуына ә сер ете алмайды. Дегенмен, С тілі кез- келген операторды жаң а қ ұ рылатын кластар ү шін қ айта анық тау мү мкіндігін қ арастырады. Оператор қ айта анық талғ ан кезде оның бастапқ ы мә ндерінің бірде бірі жоғ алмайдыб тек қ ана класс объектілері ү шін ұ қ сас мә нді оператор енгізіледі. Операторларды қ айта анық тау арнайы operator@ атымен жү зеге асырылган функцияның ерекше тү рі. Мұ ндағ ы, @ белгісі қ айта анық талатын оператор белгісі, мұ ндай функциялар ә детте функция операторлар деп аталады. Функция операторлар класс сипаттамасының ішінде жә не одан тыс анық тама алады. Сондық тан олардың келесі тү рлерін ажырат: ü жай(қ арапайым) яғ ни кластан тыс анық талатын функция оператор. Ол бір орынды(бір аргументтен тұ ратын) жә не екі орынды(екі аргументтен тұ ратын) болады. ü Компонентті, яғ ни класта анық талғ ан функция оператор. Онда бір аргумент ә рқ ашан класс объектісі болады. Функция операторының анық талуының жалпы формасы кестеде келтірілген. Кестеде келтірілген сипаттамада @ белгісі кез-келген мү мкін болатын операция < нә тиже типі> қ айтарылатын мә н типі (кө біне класс типіне сә йкес келеді, бірақ басқ а тип блуы да мү мкін) Операторларды қ айта анық тау кезінде тө мендегілерді ескеру кажет. · *, sizeof,?,:, #, ##,::, class:: операторларын қ айта анық тауғ а болмайды. · =, [ ], () – операторлары тек қ ана класс қ ұ рамында қ айта анық тала алады. · Ө айта анық талғ ан = операторы туынды кластардан мұ рагерленбейді. · Операторлардың преаритетін жә не ассоциотивтігін ө згертуге болмайды. Функция операторларды сипаттау формалары.
Функция оператордың шақ ырудың екі формасы бар кстандартты жә не операторлы.Олар келесі кестеде келтірілген.
Функция-операторларды шақ ыру формалары.
Кластан тыс функция операторды сипаттағ ан кезде оғ ан тек кластың ортақ компоненттері ғ ана қ олжетіледі. Егер функция операторғ а кластың кез-келген компоненттеріне қ атынау мү мкіншілігіне ие болу қ ажет болса, онда оны friend спецификаторымен осы класқ а достық функия ретінде анық тау қ ажет. Класс ішінде функция операторды сипаттағ анда бірінші аргумент ә рқ ашан класс объектісі болып табылады, бұ л оны қ олданудың мү мкіндіктеріне біршама шектейді. Мысалы: компонентті функция операторды сипаттау. #include < string.h> #include< stdio.h> #include< iostream.h> #include< conio.h> class sstr // жол класы
{ private: //класстың жасрын жолдары. Char *str; Int len; Public: //класстың баршағ а қ олжетілу жолдары. Void print (void) { cout < < ” жасырын жолдардың ішіндегісі: ” < < endl; cout< < ”жол”< < str< < endl; cout< < ”жол ұ зындығ ы: ”< < len< < endl; } str(){ } sstr(char *vs) { len =strlen(vs); str-new char[len+1]; strcpy(str, vs); } ~sstr() {delete str; } Sstr & operator +(sstr&); /*екіорынды операцияны жү зеге асыратын компонентті функцияның прототипі”+” */ Sstr & operator-(); /*бірорынды операцияны жү зеге асыратын компонентті функцияның прототипі”-” */ sstr & sstr:: operator-() { char c; for (int i=0; i< =len/2-1; i++) {c=str[i]; str[i]=str[len-1]; str[len-i-1]=c; } return *this; } sstr & sstr:: operator ++(sstr & A) { int l-A.len+len; char *s; s=bew char[l+1]; strcpy(s, str); strcat(s, A.str); len=l; str=s; return *this; } void main() { clrscr(); Sstr aa(“қ олдану мысалы”); sstr bb(“операцияларды қ айта анық тау”); sstr cc=aa+bb; //шақ ырудың операторлық формасы cc.print(); sstr dd; dd=aa.operator+(bb); //шақ ырудың қ алыпты формасы dd.print(); -aa; -bb; // унарлы минустың қ олданылуы-жолдарды қ арату aa.print(); getch(); } Кейбір операцияларды олардың комутативтілігін қ амтамасыз ету ү шін қ айта анық тау класс денесіндегі функция-операторлар-дың бірнеше варианттарын сипаттау керек. С++ енгізу-шығ ару кітапханасының кластарымен жұ мыс жасауда енгізу-шығ ару кластары “< < ” (ағ ымғ а қ осылу) жә не “> > ” (ағ ымнан шығ ару) операцияларын мә ліметтердің тек қ ана қ алыпты типтеріне ғ ана қ олданады. Сондық тан жолдар типін белгілі-бір қ олданушы кластар ү шін де, жә не тұ тас кластар ү шін де бұ л класс объектілерін шығ арғ ан кезде “< < ” жә не ”> > ” операцияларын ә рбір класс ү шін қ айта анық тағ ан жө н. “Ағ ымғ а қ осылу” жә не “ағ ымнан шығ ару” операцияларын қ айта анық тауда операцияларды сипаттаудың келесі формасы қ олданылады: Operator & operator< < (ostream & out, < жаң а тип> < аты>) {< функция-оператор денесі> }; Istream & operator > > (istream & in, < жаң а тип> & < аты>) {< функция-оператор денесі> }. Бұ л операцияларғ а private жә не proected сипатталғ ан жолдарды кірістіру кезінде “< < ” жә не “> > ” операцияларын серіктестік ретінде сипаттағ ан дұ рыс. Жасырын тү рде меншіктеп алу операциясы кез-келген классқ а анық талғ ан жә не кө шірмелейтін конструкторда жасырын тү рде қ олданылатынғ а ұ қ сас объектілерді кө шірмелеуді қ амтамасыз етеді. Керек жағ дайда бұ л операцияны да қ айта анық тауғ а болады. Кейбір жағ дайларда қ айта анық тау міндетті тү рде керек, мысалы динамикалық жолдармен жұ мыс жасау кезінде.
|