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

Қр білім және ғылым министрлігі

Қ. Жұбанов атындағы Ақтөбе мемелекеттік университеті

Информатика және ЕТ кафедрасы

050602 - «Информатика» мамандығы күндізгі бөлімінің

4-курс студенттеріне арналған

«OBP 4301 Объектіге бағытталған программалау» пәнінен

қысқаша дәріс конспектілер жинағы

1 дәріс.

Тақырыбы: ОБП – программалау технологиясы ретінде. ОБП-ның негізгі түсініктері

Дәріс мақсаты: объектіге бағытталған программалау түсінігін қалыптастыру, программалаудың негізгі принциптері мен қасиеттерін меңгерту, объектіге бағытталған программалау тілдеріне шолу жасау.

Кілттік сөздер: объектіге бағытталған программалау; инкапсуляция; полиморфизм; мұрагерлік; абстрактілеу; қатынауды шектеу; модульділік; иерархиялық.

Жоспар:

  1. Объектілі-бағытталған программалау тарихы

  2. Объектілі-бағытталған программалаудың негізгі принциптері

  3. Объектілі-бағытталған программалаудың қасиеттері

  4. ОБП тілдері

  1. Объектілі-бағытталған программалау тарихы

Объектілі-бағытталған программалау – процедуралық программалау идеологиясының дамуы нәтижесінде пайда болды. Одан да басқа, қазіргі объектілі бағытталған программалауда – оқиға (оқиғалы бағытталған программалау деп те атайды) және компонент (компоненттік программа) түсінігі көптеген мағына береді.

Бұл программалаудың алғашқы тілі – Симула болып табылады. 1967 жылы пайда болған бұл тіл шындыққа революциялық идеяны: объектіні, класстарды, виртуальді әдістерді және т.б ұсынды, сондықтан мұның барлығы қазіргі замандағыларға қабылдана қоймады. Соған қарамастан, көптеген концепциялар Smalltalk тілінде Алан Кей және Дэн Ингаллспен бірге дамытты. Дәл осы тіл ең алғашқы ұзақ таратылған объектілі бағытталған программалау тілі болып табылады.

Қазіргі уақытта программаның қолданбалы тілінің саны басқа парадигмаларға қарағанда көбірек. Прогаммалық жүйенің облысында әлі де процедуралық программаның парадигмасы қолданылады және де программаның жалпы қабылданған тілі – С тілі болып табылады. Операциялық жүйенің жүйелік және қолданбалы деңгейдегі өзара іс-әрекеттерде объектілі бағытталған программалау тілдері ғана өз ықпалын көрсетті. Мысалы, мультиплатформалық программаның кітапханаларының ішінде ең көп таралғаны – С++ тілінде жазылған Ot объектілі бағытталған кітапхана болып табылады.

  1. Объектілі-бағытталған программалаудың негізгі принциптері

Программалау түсінігінде объектілі бағытталған программалау программаны программалық объектілер жиынтығы түрінде көрсетуге негізделген күрделі программалық қамсыздандыруды құру технологиясы түрінде анықталады. Бұл жерде объектінің өзі қандай да бір тип (класс) экземпляры болып табылады, ал кластар қасиеттерді тұқым қуалау арқылы иерархия құрады. Мұндай жүйеде программалық объектілер қарым қатынасы хабарламаларды жіберу арқылы іске асырылады. Объектілі бағытталған программалаудың негізгі артықшылығы модульдік программалаумен салыстырғанда модульдер арасында жіберілген ақпарат көлемінің азаюы және модуларалық байланыстар санының қысқаруы. Объектілі программалау программа құрудың жаңа технологиялық құралдарын ұсынады. Олар тұқымқуалаушылық, полиморфизм, компазиция, толтыру, паралелизм. Объектілі бағытталған программалаудың негізгі кемшілігі программалық жүйе құрастырылуының күрделілігі есебінен жылдамдықтың азаюы. Объектілі бағытталған программалау негізіне абстрактілеу, қатынауды шектеу, модулділік, иерархиялық, типтеу, параллельділік және тұрақтылық принциптері жатады.

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

Қатынауды шектеу - абстракцияны іске асыратын жеке элементтерін шектеу. Қатынауды шектеу қажеттігі абстракцияны сипаттауда екі бөлікті шектеуді қарастырады:

  • Интерфейс абстракцияны жүзеге асырудың қолжеткізуге мүмкіндігі бар элементтің жиынтығы.

  • Реализация немесе жүзеге асыру. Абстракцияны жүзеге асырудың қолжеткізуге мүмкіндігі жоқ элементтің жиынтығы.

Модульділік - программалық жүйелерді құруда программаны жеке бөліктер түрінде жүзеге асыру принципі.

Иерархиялық - абстрактордың реттелген немесе ранжирленген жүйесі. Иерархиялық принципі программалық жүйелерді құруда иерархияларды қолдануды қарастырады. Объектілі бағытталған программалауда иерархияның екі түрі қолданылады:

  • “бүтін / бөлік“ иерархиясы кейбір абстрактор қарастырып отырған абстракцияға оның бөлігі ретінде кіретінін көрсетеді. Иерархияның бұл нұсқасы жобалаудың әр кезеңдерінде жүйені бөліктерге бөлу процесінде қолданылады.

  • “жалпы / жеке” иерархиясы қандай да бір абстракция, басқа абстракцияның жеке жағдайы болатынын көрсетеді. Мысалы, тамақтанатын үстел үстелдің нақты түрі, ал үстел жихаздың нақты түрі. Иерархияның бұл нұсқасы класс құрылымын құруда күрделі кластар қарапайым кластар негізінде оларға жаңа сипаттамалар қосу жолымен құрылған кезде қолданылады. Объектілі бағытталған программалаудың негізгі механизмдерінің бірі жалпы жеке иерархиясында қасиеттерді тұқымқаулау. Тұқымқуалау абстрактор арасындағы қатынас. Бұл кезде қандай да бір абстракция бір немесе бірнеше басқа абстракцияның құрылымдық немесе функционалдық бөлігін қамтиды.

Типтеу - объектілер қасиеттеріне салынатын және әр түрлі типті абстракцияның өзара алмасуына жол бермейтін шектеу. Типтеу приципін қолдану:

  • Программалық объектіге қолданатын мүмкін емес амалдармен байланысты қателерді ертерек табуға;

  • Құжаттауды жеңілдетуге;

  • Эффективтік кодты генерациялауға мүмкіндік береді.

Параллельділік - бірнеше абстракцияның қасиеттері бір уақытта активт күйде болады.

Тұрақтылық - абстракцияның процестен тәуелсіз болу қасиеті.

Осы аталған 7-принциптің төртеуі жүзеге асырылатын болса, онда тіл – объектілі бағытталған болып саналады.

  1. Объектілі-бағытталған программалаудың негізгі қасиеттері:

Объектілі – бағытталған программалаудың негізгі үш қасиеті бар: инкапсуляция, полиморфизм және мұрагерлік (тұқым қуалау).

Инкапсуляция. Кластың мәліметтер структурасы сыртынан Си тіліндегі структураға және Паскальда немесе QuickBasic-тегі жазба тәрізді объектілі бағытталған тілдер мәліметтерінің типіне ұқсас. Сондықтан, осындай структура элементтері (класс мұшелері) тек мәліметтер ғана емес, сондай-ақ әдісте (яғни процедура мен функция) бола алады. Мұндай біріктіру – инкапсуляция деп аталады.

Жалпы инкапсуляция – бұл принцип. Мұнда кез-келген класс қара жәшік тәрізді қарастыру керек. Яғни – класты қолданушы класстың тек интерфэйстік бөлігін ғана қолдануы және көруі керек және оның ішіне кірмеуі керек. Сондықтан, мәліметтерді класта – оған кіру рұқсаты оқу және жазу бойынша тікелей емес, әдіс көмегімен жүзеге асырылатын түрде ғана инкапсуляция жасау қабылданған. Инкапсуляция принципі – класстар арасындағы байланыс санын минималдайды және соған сәйкес класстың тәуелсіз реализациясын және модификациясын бекітеді.

Полиморфизм. Полиморфизм – бұл әдістің мәліметтерін шақыру кезінде қандай класстың объектісі қолданылатынан тәуелді болып келетін әр түрлі программалық кодқа (полиморфты код) – бір атпен берілген функцияның сәйкес келу құбылысы. Полиморфизм – класс ұрпақтарының міндетті түрдегі сигнатуралық әдіспен берілген класстың алдыңғы ұрпақтарының реализациялық әдісін өзгертумен қамтамасыз етіледі. Бұл класс ұрпақтарының өзгермейтін интерфэйсінің сақталуын қамтамасыз етеді және әр түрлі класпен берілген кодта әдіс атымен байланысуды жүзеге асырады. Мұнда шақыру қай кластың объектісімен жүзеге асырылады, мәліметтер атымен берілген әдіс те сол кластан алынады. Мұндай механизм динамикалық (жай) байланысу деп атайды.

Жай және күделі палиморфизм. Кез – келген прогаммалау тілінде класстар иерархиясын құру үшін полимарфизм механизмі қарастырылған. Ол иерархияның әр түрлі деңгей класстары үшін қандай да бір аты бойынша біріккен әдістің әр түрлі аспектілерін анықтауға мүмкіндік береді. Полимарфизмді жай және күрделі деп бөледі. Жай полимарфизм ерте байланысу механизміне негізделеді. Ал күрделі полимарфизм кеш байланысу механизмін қолданылады.

Жай немесе статикалық полимарфизм С++ тілінде компиляция кезінде қолданылады және функцияларды қайта анықтау механизмі көмегімен іске асырылады. Мұндай полиморфты функциялар С++ -те қайта анықталатындар деп аталады. Жалпы ережелерге сәйкес олар қайталанатын параметр типімен және сигнатурамен яғни жіберілетін параметр сонымен типімен және кезектесу ретімен ерекшеленеді.

Мұрагерлік. Мұрагерлік – класс алдындағы ұрпақтың барлық қасиеттерін және әдістерін сақтай отырып, бір кластың басқа кластан пайда болу мүмкіндігі. Мұрагерлік қатынасымен байланысқан кластар жиынтығы – иерархия деп атайды. Нақтырақ айтқанда, объект келесі объектінің негізгі қасиеттерін мұра ете алады және тек оған ғана сәйкес кескіндер қоса алады. Мұрагерлік маңызды, себебі ол кластар иерархиясын қолдану үлкен информация лектерін басқарылатындай етеді.

  1. Объектілі-бағытталған программалау тілдері

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

Осындай тілдердің алғашқысы барлық деректерді кейбір кластардың объектілері болып табылатын, ал кластардың жалпы жүйесі алдын-ала анықталған базалық кластардың негізінде иерархиялық құрылым сияқты салынатын SmallTalk тілі болды.

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

Сондай-ақ, объектіге бағытталған программалау тілі ретінде Оберон тілін айтуға болады. Ол – жоғары санап шығу құралдарынан басқа ешқандай объектілі құралдардан тұрмайды ( тіпті онда класты хабарлауға арналған жеке кілттік сөз де жоқ). Бірақ көптеген тілдер көрсетілген кішкене жиынтыққа осы немесе басқа да қосымша құралдарды қосады. Оның қатарында:

  • Конструкторлар, деструкторлар, финализатор

  • Қасиеттер (аксессорлар)

  • Индексатор

  • Көпше түрде берілген альтернативтегі мұрагерлік тәрізді интерфэйс

  • Класқа арналған операторды анықтау

Қазіргі кезде объектіге бағытталған программалау тілі – келесідей синтаксистік құралдар жиынтығын ұсынады:

  • Кластың өрістерімен (класс мүшелерінің мәліметтерімен ) және әдістерімен (класс мүшелерінің функциясымен) берілген хабарлама.

  • Класты кеңейту (мұрагерлік) механизмі – жаңа кластың бұрыннан бар кластың алдыңғы ұрпақтарынан туылуы. Сондықтан, объектіге бағытталған программалау тілдері тек жекеше мұрагерлікті ғана үстанады.

  • Класты ішкі структурадан қорғау құралы. Көбінесе оларға – public, private типті өріске және әдіске берілген қол жетімді модификаторы, кейде protected, кей жағдайда одан да басқалары.

  • Әр түрлі кластың сол бір айнымалы экземплярына рұқсат ететін полиморфты айнымалылар және функция параметрі (әдістері).

  • Виртуалды әдістерді қолдану орнына берілген класс экземплярының полиморфты тәртібі. Көптеген объектіге бағытталған программалау тілдерінде кластың барлық әдістері виртуалды болып табылады.

Қазіргі кезде көп қолданылатын объектіге бағытталған тілдер объектті Паскаль, Си ++, Java,VisualBasic, SmallTalk кездеседі. Мұндай тілдер арнайы объектіге бағытталған программаны оңай етуге құрылған. Сонымен бірге объектілермен жұмыс істеу үшін көп дамыған құралдар С++ құрамында бар.

С++ іс жүзінде объектіге бағытталған программалаудың құралдарымен толықтырылған.

Бақылау сұрақтары:

  1. Объектіге бағытталған программалау дегеніміз не?

  2. Объектіге бағытталған программалаудың негізгі принциптері қандай?

  3. Объектіге бағытталған программалаудың қасиеттерін қандай?

  4. Қандай объектіге бағытталған тілдер бар?

  5. Қандай программалау технологиялары бар?

Әдебиеттер:

  1. Г.С. Иванова и др. ООП: Учебник для вузов, М., Изд-во МГТУ им.Баумана, 2003.- 368 с.

  2. А.В. Замулин. Курс лекций: Объектно-ориентированное программирование (С++)

  3. А.В. Замулин. Курс лекций: ООП (С++, Ява, C#)

  4. Бьерн Страуструп. Язык программирования С++. Третье издание. - М.: Изд. Бином, Невский Диалект, 1999.

2 дәріс.

Тақырыбы: С++ тілінің объектілі-бағытталған құралдары. Объектілер, кластар

Дәріс мақсаты: кластар және объектілер туралы түсінік беру, объект өрістерін инициализациялау жолдарын көрсету, кластың статикалық мүшелерін талдау.

Кілттік сөздер: класс, объект; private; protected; public; inline; this көрсеткіші.

Жоспар:

  1. Класты анықтау

  2. Объект өрістерін инициализациялау

  3. This көрсеткіші

  4. Кластың статикалық компоненттері

  1. Класты анықтау

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

Class <класс аты>

{ Private: <класстың ішкі компоненттері>

Protected: <класстың қорғалған компоненттері>

Public: <класстың жалпы компоненттері>

};

Классты сипаттауда компонент ретінде обьект параметрлерін сақтауға арналған өрістер және олармен қарым – қатынас ережелерін сипаттайтын функциялар алынады. Обьектілі бағытталған программалау стандартты терминологиясына сәйкес класс компоненттерін – функцияларды немесе компонентті функцияларды әдістер деп аталады.

Private бөлімінде анықталған немесе хабарланған класс компоненттері ішкі деп аталады олар тек осы кластың компонеттері функциясына ғана қолжетімді және де сипатталатын класстың достық функциясына қолжетімді.

Protected бөлімінде анықталатын класс компоненттері қорғалған деп аталады. Олар тек осы класстың компонентттері классына ғана емес сонымен қатар оның туынды класстарының да компоненттік класс да қолжетімді. Жаратылыстан ие болу болмаған жағдайды ішкі компонент ретінде интерпретацияланады.

Public бөлімінде анықталатын класс компоненттері жалпы деп аталады. Олар класстан тыс программаның кез келген бөлімінде қолжетімді. Дәл осы бөлімде класстың интерфейстік бөлігінің өрістері мен әдістері анықталады.

Егер классты анықтау кезінде компоненттерге қатысты тип көрсетілмесе, үнсіз жағдайда private типі алынады.

Класс өрістері әрқашан класс ішінде сипатталады, ал компонентті функциялар класстың ішінде де сыртында да сипаттала алады. Соңғы жағдайда классты анықтау осы функциялар прототипін қамту керек, ал функция басы класс атын және “::” белгісін қамту керек. Осылайша компиляторға анықталатын функцияға класстың ішкі өрістері қолжетімді екені хабарланады.

<функция типі> <класс аты> :: <функция аты> (<параметрлер тізімі>)

{<компонентті функция денесі>}

  1. Объект өрістерін инициализациялау

С++ ережесі бойынша егер компоненттік функция денесі класс сипаттамасында орналасқан болса, онда бұл функция іштестірілген (inline) болып саналады. Төменде келтірілген мысалда кластың компоненттік функциялары үнсіз жағдайда іштестірілген болады.

#include<stdio.h>

#include<conio.h>

Class x

{private:char c;

Public:int x,y;

Void print(void)

{clrscr();

goto(x,y);

printf(“%c”,c);

x=x+10; y+y+5; goto(x,y);

Printf(“%c”,c);

}

Void set_x(char ach, int ax, int ay)

{c=ach; a=ax; y=ay; }

};

Іштестірілген компоненттік функцияларды кластан бөлек те сипаттауға болады. Ол үшін функция басына inline қызметші сөзін қосу керек. Компоненттік функцияларды анықтау кезінде келесі функцияларды іштестірілген ретінде алуға рұқсат етілмеуін ескеру қажет:

  • циклді, ассемблерлік қоюларды, ауыстырғыштарды қамтитын функциялар;

  • рекурсивті функциялар;

  • вертуальді функциялар;

Класты анықтауды программа текстінен бұрын орындауға болады не болмаса бөлек файлға жазып, оны программаға #include дерективасы көмегімен қосуға болады. Жазылуы: #include <файл аты>

Бұрын анықталған кластарды қолдану программада қажет жағдайда класс объектілері хабарлайды, мұндай хабарлау келесі түрде болады:

<класс аты> <объектілер немесе көрсеткіштер тізімі>

Класс өрістерін хабарлаған кезде оларды инициялизациялау мүмкін емес. Себебі, өрісті сипаттау кезінде оның орналасуы үшін жады бөлінбейді. Оның бөлінуі – класс үшін емес, класс объектілері үшін орындалады.

Сондықтан, өрістің инициализациясы тек нақты класс оъектілерін хабарлағаннан кейін мүмкін болады. Объект өрісіне мән беру программасын орындау барысында бірнеше әдістерді іске асырады:

  • объект өрісіне тікелей мән меншіктеу

  • қолданылып отырған кластың кез-келген компонентті функциясы ішінде

  • С++ ережесіне сәйкес инициализациялау операторының қолданылуы

Жоғарыда келтірілген әдістер тек Public секциясында сипатталған өрістерді инициализациялауға қолданылады.

Private және Pratected секциясында сипатталған өрістерді инициализациялау тек компоненттік функциялар көмегімен жүзеге асырылады.

  1. This көрсеткіші

Егер функция – нақты объектінің мәліметтерін өңдеу үшін шақыратын болса, онда бұл функция көрсеткіші автоматты түрде функция шақырған объектіге беріледі. Бұл көрсеткіш This деп аталады және класс функциясында мына түрде сипатталады:

<Класс_аты> * const this = <объект_адресі>;

This көрсеткіші әрбір статикалық емес компонентті функцияның қосымша жасырын параметрі болып табылады. Класқа тиісті функцияның денесіне кіру кезінде – this көрсеткіші функция шақырған объект адресінің мәні ретінде инициялизациялайды. Нәтижесінде бұл объект функцияның ішінде қол жетімді болып таблады.

Көп жағдайда this көрсеткіші нақты түрде қолданылады. Кластың статикалық емес функциясының әрбір мүшелеріне this көрсеткіші – сәйкес объектіге кіру үшін қолданылады.

  1. Кластың статикалық компоненттері

Класс – бұл тип. Ал обьект сол класстың программадағы нақты көрінісі. Әр обьект үшін өзінің класс өрістерінің көшірмесі болады, егер бір типтің барлық обьектілері кейбір мәліметтерді бірігіп қолданса, онда сол мәліметтерді орналастыру және оларға класстың барлық обьектілерінен қатынауды қамтамасыз ету мәселесі туындайды. Ол үшін статикалық компоненттер механизмі қолданылады. Статикалық деп – static модификаторы мен хабарланған класс компоненттері аталады. Мұндай компоненттер класс бөлігі болып табылады бірақ осы класстың обьектілеріне кірмейді.

Класстың статикалық өрістерінің тек бір ғана көшірмесі бар болады. Бұл өрістердің инициализациясы міндетті түрде классты анықтаудан тыс орналасады.

Статикалық өрістер кластың барлық объектілеріне ортақ мәліметтерді сақтау үшін қолданылады. Мысалы, объект саны немесе ресурстың бөлінген барлық объектілеріне сілтеме. Бұл өрістер кластың жеке экземплярондағы барлық объектілер үшін бар болады.

Төменде статикалық өрістің ерекшеліктері көрсетілген:

  • Жады статикалық өрісте құрылған объектілердің санынан тәуелсіз (тіпті ол қатыспаған кезде) инициялизацияланған кезде бір-ақ рет белгіленеді және әрекет ету облысына рұқсат беру операциясы көмегімен инициализациялайды:

  • Статикалық өрістер – кластың аты арқылы қол жетімді болғаны тәрізді, объектілер атымен де қол жетімді.

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

Статикалық өрістердегі жады “size of“ операциясының көмегімен объектінің размерін анықтау кезінде саналмайды

Бақылау сұрақтары:

  1. Класс дегеніміз не?

  2. Класс типті айнымалы қалай аталады?

  3. private; protected; public қызметші сөздері нені анықтайды?

  4. This көрсеткіші қалай қолданылады?

Әдебиеттер:

  1. Павловская Т.А. С и С++. Программирование на языке высокого уровня.

  2. Г.С. Иванова и др. ООП: Учебник для вузов, М., Изд-во МГТУ им.Баумана, 2003.- 368 с.

  3. Бьерн Страуструп. Язык программирования С++. Третье издание. - М.: Изд. Бином, Невский Диалект, 1999.

  4. Р. Лафоре. Объектно-ориентированное программирование в С++.4-е издание. Питер.2004

3 дәріс.

Тақырыбы: Конструкторлар және деструкторлар. Іштестірілген кластар

Дәріс мақсаты: контрукторлар және деструкторлар туралы түсінік беру, оларды қолдануды үйрету, сонымен қатар конструктор түрлеріне тоқталу.

Кілттік сөздер: конструктор; деструктор; көшіру конструкторы; аргументі бар конструктор; қалыпты жағдайдағы конструктор.

Жоспар:

  1. Конструкторлар

  2. Конструктор түрлері

  3. Деструкторлар

  1. Конструкторлар

Конструкторлар класс айнымалыларын инициализациялауға және жадыдан орын бөлуге арналған айрықша функция болып табылады.

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

Конструктор көмегімен айнымалы – мүшелерді инициализациялау. Конструктoрды негізгі практикалық қолдану , кластың жабық айнымалы – мүшелерін инициализациялаудан тұрады. Бұдан басқа конструкторда айнымалымен бірге берілген мәнді қалыпты жағдайда меншіктеп алуға болады, мысалы: Бұл жерде айта кететін жайт, айнымалы – мүшелер қарапайым айнымалыларға қарағанда меншіктеп алу операторының көмегімен тікелей инициализациялауы мүмкін емес. Міне, сондықтан барлық осыған ұқсас опрецияларды конструкторға салуға тура келеді.

Конструкторды қолдану. С++ деконструкторды қолданумен объектіні инициализациялаудың 2 әдісі қарастырылған. Олардың біріншісі – конструкторды айқын шақыру:

stock food=stock(“World Cabbadge”, 250,1.25);

Бұл команданың көмегімен food объектісінің, company элементіне ... rld cabbade жолы shares элементіне - 250 мәні, және т.с.с. меншіктеледі.

Екінші әдіс конструкторды шақырудың айқын емес түрін қарастырады:

stock garment(“Furry Mason”; 50, 2.5);

С++ те жадыны динамикалық бөлу үшін new спецификаторын қолдану кезінде де, осы кластың объектісі құрылғанда әркез класс конструкторы пайдаланылады. New спецификаторы бар конструктор келесі түрде қолданылады:

stock *pstock=new stock(“Elektroshock Games”, 18, 19.0);

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

  1. Конструктор түрлері

Бір класста бірнеше конструктор болуы мүмкін. Конструкторлардың үш түрі бар:

  • Қалыпты жағдайда конструкторлардың параметрлері болмайды. Егер класстың құрамында бірде-бір конструктор болмаса, онда компилятор автоматты түрде бір конструкторды құрады. Оның қызметі - класс объектісін құру кезде жады бөлу.

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

  • Көшіру конструкторы класс объектісінен мәліметтерді көшіру арқылы осы класстың басқа объектілерін құрады.

Қалыпты жағдайда берілген конструктор. Қалыпты жағдайда берілген конструктор дегеніміз – инициализациялауға арналған айқын мәндер болмаған кезде объект құруға пайдаланылатын конструктор. Басқаша айтқанда, конструктор мынадай түрдегі жариялауға қолданылады: stock:stock1; // қалыпты жағдайда берілген

// конструктор қолданып жатыр

Берілген оператордың сонда да жұмыс істеп тұрғандығының себебі – егер ешқандай конструкторлар болмаса, С++ те қалыпты жағдайда берілген конструкторлар автоматты түрде қолданылады. Мұндай конструтор болып қалыпты жағдайда берілген конструктор түрі табылады, ол ешқандай әрекет орындамайды. Stock класы үшін қалыпты жағдайда берілген конструкторда аргумент болмайтындағы жариялауда мәндер болмайтынын көрсетеді.

Компилятор қалыпты жағдайда берілген конструкторды бағдарламада ешқандай конструктор анықталмаған кезге дейін ғана қамтамасыз етеді. Нақтылы бір класқа нақтылы конструктор бекітілген соң, үндемей берілген конструкторды ұсыну міндеттемесін компилятор программистке жүктейді. Егер сіз қалыпты жағдайда қолданылмайтын конструкторды пайдалансаңыз, өзіңіздің өзіндік конструктор ұсынысын, Stock Stock1; түріндегі хабарлама қате болып келеді. Мұндай әрекеттің себебі сізде инициализацияланбаған объектілерді құруды мүмкін еместей ететін қажеттілік туындауы мүмкін. Егер, бірақ, нақты инициализациясыз объектілер құру қажеттігі туындаса, қалыпты жағдайда жұмыс істейтін өзіндік конструкторды анықтаған дұрыс. Қалыпты жағдайда жұмыс істейтін өзіндік конструкторды анықтаған дұрыс. Қалыпты жағдайда жұмыс істейтін конструкторды түрлі әдістермен анықтауғы болады. Олардың бірі – қызмет етіп тұрған конструктордың барлық аргументтеріне қалыпты жағдайда берілген мәндерді меншіктеу. Екінші әдіс аргументсіз екінші конструкторды алуға болады, сондықтан сіз екеуін де құрып қоймағаныңызға көз жеткізіп алыңыз.

Практикада, әдетте, барлық элементтер белгілі, корректілі таңдалған мәндерден басталатына сенімді болу үшін объектілерді инициализациялау керек етеді. Осылайша, қалыпты жағдайда берілген конструктор барлық элементтер мәнінің түсініксіз инициализациясын жүзеге асырады.

Параметрлі констукторлар. Бұл кейде тиімді болады, бірақ көп жағдайда бір немесе бірнеше параметрлі конструкторлар қолданылады. Параметрлер конструкторда да әдістегі сияқты қолданылады. Келесі мысалда параметрлі конструкторлары бар MyClass класы көрсетілген:

using System;

class MyClass {

public int x;

public MyClass(int i) {

x=i;

}

}

class ParmConsDemo {

public static void Main() {

MyClass t1=new MyClass(10);

MyClass t2=new MyClass(88);

Console.WriteLine(t1.x+” ”+ t2.x);

}

}

  1. Деструкторлар

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

Деструктор да конструтор сияқты префикс ретінде тильда ( ~ ) белгісі бар класс атын ұстанады. Деструктор бағдарламада класс объектісіне сілтегіші бар delete операторы кездескенде және объект өзінің көзге көрінетін обылыстан тыс шығып кеткен кезде автоматты түрде шақырылады. Конструкторлардан ерекшелігі Деструкторлар ешқандай аргументтерді қабылдамайды. Және қайта жүктеуі мүмкін емес. Егер деструктор түсінікті берілмесе, компилятор класқа қарапайым деструкторын ұсынады.

Егер объектіні құруда конструктор қолданылса, бағдарлама бұл объектіге жүктелген міндетін орындамайынша бағдарлама оны бақылап отырады. Осы кезде бағдарлама деструктор барлық қалған «қоқысты» жою керек, осылайша ол деструктор да , таза конструкторлық міндеттерді орындайды. Мысалы, егер сіздің конструктор жадыны бөлу үшін new спецификаторын қолданса, деструтор delete операторының көмегімен жадыны босатады. Stock конструторы ешқандай ерекше әрекет жасамайды, мысалы, New спецификаторын қолданбайды, сондықтан оған деструктор керек емес. Алайда ең болмаса кластың кейінгі тексерістері үшін мұндай функцияның болғаны жаман болмас еді.

Деструктордан қашан көмек сұраған жөн? Бұл шешімді компилятор қабылдайды, сіздің бағдарламалық кодыңызда деструкторға айқын қаратпалар болмауы керек. Егер сіз статикалық класс жады бар объект жасап жатсаңыз, онда оның деструкторы бағдарламаны орындау соңында автоматты түрде шақырылады. Егер сіз автоматты класс жады бар жасап жатсаңыз, онда оның дестркуторы бағдарлама объект анықталған бағдарламаның код блогынан шыққан кезде автоматты түрде шақырылады. Егер объект new спецификаторын қолдану арқылы құрылса, ол жадының динамикалық бөлінетін обылысында немесе бос жадыда орналасады, ал оның деструкторы жадыны босату үшін delete операторын қолдану қажет болған кезде автоматты түрде уақытша объектілерді құруы мүмкін; бұл жағдайда бағдаралама объектіні қолданып болған кезде оны – жою үшін автоматты түрде деструкторды шақырады.

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

Бақылау сұрақтары:

  1. Конструктор дегеніміз не?

  2. Конструктордың қандай түрлері бар?

  3. Деструктор қандай қызмет атқарады?

  4. Конструктор мен деструктордың айырмашылығы неде?

Әдебиеттер:

  1. Павловская Т.А. С и С++. Программирование на языке высокого уровня.

  2. Г.С. Иванова и др. ООП: Учебник для вузов, М., Изд-во МГТУ им.Баумана, 2003.- 368 с.

  3. Бьерн Страуструп. Язык программирования С++. Третье издание. - М.: Изд. Бином, Невский Диалект, 1999.

  4. Р. Лафоре. Объектно-ориентированное программирование в С++.4-е издание. Питер.2004

4-5 дәріс.

Тақырыбы: Кластарды мұрагерлік ету. Мұрагерлік түрлері

Дәріс мақсаты: объектіге бағытталған программалаудың негізгі қасиеттерінің бірі – мұрагерлікпен танысу, оның түрлерін ажырата білуге үйрену.

Кілттік сөздер: мұрагерлік; жалғызданған мұрагерлік; көпше түрдегі мұрагерлік; мұрагерлік түрі; туынды класс; базалық класс.

Жоспар:

  1. Жалғызданған мұрагерлік

  2. Көпше түрдегі мұрагерлік

  1. Жалғызданған мұрагерлік

Объектілі бағытталған класстар шынайы және бағдарламалы желінің концепцияларын модельдеуге қолданылады. Пәндік аймақтың концепциялары әр түрлі қарым қатынаста болады. Сондай қарым-қатынастардың бірі – мұрагерлік қатынасы.

Мұрагерлік – класс алдындағы ұрпақтың барлық қасиеттерін және әдістерін сақтай отырып, бір кластың басқа кластан пайда болу мүмкіндігі. Мұрагерлік қатынасымен байланысқан кластар жиынтығы – иерархия деп атайды. Нақтырақ айтқанда, объект келесі объектінің негізгі қасиеттерін мұра ете алады және тек оған ғана сәйкес кескіндер қоса алады. Мұрагерлік маңызды, себебі ол кластар иерархиясын қолдану үлкен информация лектерін басқарылатындай етеді.

Мысалы, егерде 1.2 тапсырманың шарты тек қана үшбұрыштарды ғана емес, сонымен қатар төртбұрыштарды өңдеу талаптарында сақталса, жаңа Tetragon класының талдануы Triangle класының жалпы болмысын анықтар еді. Үшбұрыштардың да, төртбұрыштардың да “көпбұрыш” деген жалпы ұғымнан гөрі жеке(арнайы, нақты) жағдай, бұндай жалпылықтың себебі болып табылады. Сондықтанда Triangle және Polygon класын жасау, ал соңғы екі класты базалық Polygon класының мұрагері деп хабарлау ұтымды болар еді. С++ тілі бұны жеңіл жасауға мүмкіндік береді:

class Polygon{

// . . .

};

class Triangle: public Polygon{

public:

Show();

};

class Tetragon:public Polygon{

public:

Show();

}:

Бұл мысалда туынды кластар Triangle және Tetragon барлық базалық элементтерді Polygon мұрагерлікке алады, бірақ олардың әрқайсысының өзіндік әдісі бар show(). Кейбір кезде мұрагерлік қарым қатынас <<is a>> қарым-қатынас деп аталады, кей кезде бұны “өзімен көрсету” депте атайды. Туынды кластың ортақ синтаксисы жай мұрагерліктің пайда болуы:

class аты: пайда_болу кілті, базалық_класс аты {

// класстың денесі

}:

Көпші түрдегі мұрагерлік кезінде екі нүктеден кейін үтір қойылады және барлық базалық кластар пайда болу кілтімен бірге.

Мұрагерлік түрі

Базалық класта компоненттерді анықтау

Туынды класта компоненттердің көрінуі

Private

Private

protected

public

мүмкін емес

Private

Private

Protected

Private

protected

public

мүмкін емес

protected

protected

Public

Private

protected

public

мүмкін емес

protected

public

Туынды кластың өзі қандай да бір класс үшін базалық бола алады. Бұндай класс аралық байланыстар кластар иеархиясын құрайды. Иеархия көбінесе ағаш болып табылады, бірақ та графалын құрылым бола алмайды. Мұндағы мұрагерлік түрі public, protected, private кілттік сөздермен анықталады. Егер мұрагерлік түрі көрсетілмесе онда үнсіз жағдайда public қолданылады. Бірақ программалардың жақсы стилі кез – келген жағдайда мұрагерлік түрі көрсетілуін талап етеді.

Т

Туынды класстан базалық класстың өрістерімен функцияның көрінуі мұрагерлік түрімен анықталады және кестеде келтірілген:

Жалпы мұрагерліктің екі түрі бар:

        1. Жалғызданған мұрагерлік

        2. Көпше түрдегі мұрагерлік