Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Операторларды қайта анықтау.






С++ тілінде стандартты анық талатын типтерге қ олданылатын операторлар кірістірілген болып табылады. Яғ ни программист бұ л оператордың орындалуына ә сер ете алмайды. Дегенмен, С тілі кез- келген операторды жаң а қ ұ рылатын кластар ү шін қ айта анық тау мү мкіндігін қ арастырады. Оператор қ айта анық талғ ан кезде оның бастапқ ы мә ндерінің бірде бірі жоғ алмайдыб тек қ ана класс объектілері ү шін ұ қ сас мә нді оператор енгізіледі.

Операторларды қ айта анық тау арнайы operator@ атымен жү зеге асырылган функцияның ерекше тү рі. Мұ ндағ ы, @ белгісі қ айта анық талатын оператор белгісі, мұ ндай функциялар ә детте функция операторлар деп аталады. Функция операторлар класс сипаттамасының ішінде жә не одан тыс анық тама алады. Сондық тан олардың келесі тү рлерін ажырат:

ü жай(қ арапайым) яғ ни кластан тыс анық талатын функция оператор. Ол бір орынды(бір аргументтен тұ ратын) жә не екі орынды(екі аргументтен тұ ратын) болады.

ü Компонентті, яғ ни класта анық талғ ан функция оператор. Онда бір аргумент ә рқ ашан класс объектісі болады.

Функция операторының анық талуының жалпы формасы кестеде келтірілген. Кестеде келтірілген сипаттамада @ белгісі кез-келген мү мкін болатын операция < нә тиже типі> қ айтарылатын мә н типі (кө біне класс типіне сә йкес келеді, бірақ басқ а тип блуы да мү мкін)

Операторларды қ айта анық тау кезінде тө мендегілерді ескеру кажет.

· *, sizeof,?,:, #, ##,::, class:: операторларын қ айта анық тауғ а болмайды.

· =, [ ], () – операторлары тек қ ана класс қ ұ рамында қ айта анық тала алады.

· Ө айта анық талғ ан = операторы туынды кластардан мұ рагерленбейді.

· Операторлардың преаритетін жә не ассоциотивтігін ө згертуге болмайды.

Функция операторларды сипаттау формалары.

 

Жай функция Компонентті функция
бірорынды < нә тиже типі> operator@(аргумент) Екіорынды < нә тиже типі> operator@ ()
екіорынды < нә тиже типі> operator@(арг1, арг2) екіорынды < нә тиже типі> operator@(аргумент2)

 

Функция оператордың шақ ырудың екі формасы бар кстандартты жә не операторлы.Олар келесі кестеде келтірілген.

 

Функция-операторларды шақ ыру формалары.

 

Стандартты форма Оператор форма
Жай функция ү шін operator@(< аргумент>) operator@(< арг1> < арг2>) Жай функция ү шін @< аргумент> < аргумент1> @< аргумент2>
Компонент функция ү шін < аргумент>.operator@() < арг1>.operator@(< арг2>) Компонент функция ү шін @< аргумент> < аргумент1> @< аргумент2>

 

Кластан тыс функция операторды сипаттағ ан кезде оғ ан тек кластың ортақ компоненттері ғ ана қ олжетіледі. Егер функция операторғ а кластың кез-келген компоненттеріне қ атынау мү мкіншілігіне ие болу қ ажет болса, онда оны 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 сипатталғ ан жолдарды кірістіру кезінде “< < ” жә не “> > ” операцияларын серіктестік ретінде сипаттағ ан дұ рыс.

Жасырын тү рде меншіктеп алу операциясы кез-келген классқ а анық талғ ан жә не кө шірмелейтін конструкторда жасырын тү рде қ олданылатынғ а ұ қ сас объектілерді кө шірмелеуді қ амтамасыз етеді. Керек жағ дайда бұ л операцияны да қ айта анық тауғ а болады. Кейбір жағ дайларда қ айта анық тау міндетті тү рде керек, мысалы динамикалық жолдармен жұ мыс жасау кезінде.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.008 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал