Дәріс №5
Тақырыбы: Амалдарды қайта анықтау. Операторларды қайта жүктеу.
Қарастырылатын сұрақтар:
Функция операторларды сипаттау формалары.
Операторларды қайта анықтау.
Функция-операторларды шақыру формалары.
Операторларды қайта анықтаудың түрлері.
Унарлы операторларды қайта анықтау.
Бинарлы операторларды қайта анықтау.
Меншіктеу операторларын қайта анықтау.
New және delete операторларын қайта анықтау.
Операторларды қайта анықтау.
С++ тілінде стандартты анықталатын типтерге қолданылатын операторлар кірістірілген болып табылады. Яғни программист бұл оператордың орындалуына әсер ете алмайды. Дегенмен, С тілі кез- келген операторды жаңа құрылатын кластар үшін қайта анықтау мүмкіндігін қарастырады. Оператор қайта анықталған кезде оның бастапқы мәндерінің бірде бірі жоғалмайдыб тек қана класс объектілері үшін ұқсас мәнді оператор енгізіледі.
Операторларды қайта анықтау арнайы operator@ атымен жүзеге асырылган функцияның ерекше түрі. Мұндағы, @ белгісі қайта анықталатын оператор белгісі, мұндай функциялар әдетте функция операторлар деп аталады. Функция операторлар класс сипаттамасының ішінде және одан тыс анықтама алады. Сондықтан олардың келесі түрлерін ажырат:
жай(қарапайым) яғни кластан тыс анықталатын функция оператор. Ол бір орынды(бір аргументтен тұратын) және екі орынды(екі аргументтен тұратын) болады.
Компонентті, яғни класта анықталған функция оператор. Онда бір аргумент әрқашан класс объектісі болады.
Функция операторының анықталуының жалпы формасы кестеде келтірілген. Кестеде келтірілген сипаттамада @ белгісі кез-келген мүмкін болатын операция <нәтиже типі> қайтарылатын мән типі (көбіне класс типіне сәйкес келеді, бірақ басқа тип блуы да мүмкін)
Операторларды қайта анықтау кезінде төмендегілерді ескеру кажет.
*, sizeof, ?, :, #, ##, ::, class:: операторларын қайта анықтауға болмайды.
=, [ ], ( ) – операторлары тек қана класс құрамында қайта анықтала алады.
Өайта анықталған = операторы туынды кластардан мұрагерленбейді.
Операторлардың преаритетін және ассоциотивтігін өзгертуге болмайды.
Функция операторларды сипаттау формалары.
Жай функция
|
Компонентті функция
|
бірорынды
<нәтиже типі> operator@(аргумент)
|
Екіорынды
<нәтиже типі>operator@ ()
|
екіорынды
<нәтиже типі>operator@(арг1,арг2)
|
екіорынды
<нәтиже типі>operator@(аргумент2)
|
Функция оператордың шақырудың екі формасы бар кстандартты және операторлы.Олар келесі кестеде келтірілген.
Функция-операторларды шақыру формалары.
Стандартты форма
|
Оператор форма
|
Жай функция үшін
operator@(<аргумент>)
operator@(<арг1><арг2>)
|
Жай функция үшін
@<аргумент>
<аргумент1>@< аргумент2>
|
Компонент функция үшін
<аргумент>.operator@()
<арг1>.operator@(<арг2>)
|
Компонент функция үшін
@<аргумент>
<аргумент1>@<аргумент2>
|
Кластан тыс функция операторды сипаттаған кезде оған тек кластың ортақ компоненттері ғана қолжетіледі. Егер функция операторға кластың кез-келген компоненттеріне қатынау мүмкіншілігіне ие болу қажет болса, онда оны friend спецификаторымен осы класқа достық функия ретінде анықтау қажет.
Жасырын түрде меншіктеп алу операциясы кез-келген классқа анықталған және көшірмелейтін конструкторда жасырын түрде қолданылатынға ұқсас объектілерді көшірмелеуді қамтамасыз етеді. Керек жағдайда бұл операцияны да қайта анықтауға болады. Кейбір жағдайларда қайта анықтау міндетті түрде керек, мысалы динамикалық жолдармен жұмыс жасау кезінде.
Достарыңызбен бөлісу: |