Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМКД_ОБП_Урдабаева.doc
Скачиваний:
113
Добавлен:
01.03.2016
Размер:
1.29 Mб
Скачать

2. Операторларды қайта анықтаудың түрлері.

С++ көптеген операциялар жұмысын нақтылы класс обьектілеріменқолданған кезде олар берілген функцияларды орындайтындайетіп кйта анықтауға мүмкіндік береді. Бұл өзіндік типтерді дәл стандартты типтердей қолдануға көмектеседі. Өзіндік операциялар белгілерін енгізуге болмайды. С++ те бар кез-келген операторларды қайта анықтауға болады, тек мынадан басқа:

. .* ?: : : # ## sizeof

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

  • Операторларды қайта анықтау кезінде аргументтер көлемі, мәліметтердің қалыпты типтерінде қолданылатын ассоциациялар ережелері ( оңнан солға қарай және солдан онға қарай) және операциялар приоритеттері сақталады;

  • Мәліметтердің стандартты типтері үшін операторларды қайта анықтауға болмайды;

  • Функция-операторлар жасырын түрде қойылатын аргументтерге ие емес;

  • Функция-операторлар мұраға беріледі (= басқасы);

  • Функция-операторлар static сияқты анықтала алмайды;

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

Функция-оператордың operator деген кілттік сөзі болады, одан кейін қайта анықталатын операторының белгісі жүреді:

Тип operator оператор (параметлер тізімі) {функция денесі }

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

Класстың ішінде анықталатын унарлы функция-операторлар параметрлерсіз тұрақты емес әдістің көмегімен көрсетілуі керек, бұл кезде операнд болып оны шақырған обьект табылады, мысалы:

Class monstr {

monstr & operator ++() {++health: return *this}

};

monstr Vasia:

cout << (++Vasia).get_health():

Егер функция класстан тыс анықталатын болса, ол класс типінің бір параметріне ие болу керек:

Class monstr {

Friend monstr & operator ++(monstr &M):

}; r

monstr& operator ++(monstr &M) {++M.health: return M:}

Егер класс ішіндегі функцияны серіктестік ретінде сипаттамасақ, өзгертілетін жолдар қолжетімділігін ескеру қажет. Берілген жағдайда health жолы private спецификаторымен сипатталғандықтан сыртқа қолжетімсіз, сондықтан оны өзгерту үшін сәйкес әдісті қолдану қажет. сипаттауға monstr класының health жолының мағынасын өзгіртуге мүмкіндік беретін change_health әдісін енгіземіз:

void change_health(int he) { health =h: }

Сол кезде инкремент операторын кластан тыс сипатталған қарапайым функция көмегімен қайта анықтауға болады:

monstr& operator ++(monstr &M) {

int h = M.get_health(); h++

M.chenge_health(h);

return M;

}

Постфикстілі инкремент және декремент операторлары int типінің бірінші параметріне ие болу керек. Ол тек қана оларды префиксті түрден ажырату үшін қолданылады:

Class monstr{

monstr operator ++(int) {

monstr M(*this): health++

return M;

}

};

monstr Vasia;

cout << (Vasia++).get_health();