Дәріс мақсаты: контрукторлар және деструкторлар туралы түсінік беру, оларды қолдануды үйрету, сонымен қатар конструктор түрлеріне тоқталу.
Кілттік сөздер: конструктор; деструктор; көшіру конструкторы; аргументі бар конструктор; қалыпты жағдайдағы конструктор.
Жоспар:
- Конструкторлар
- Конструктор түрлері
- Деструкторлар
- Конструкторлар
Конструкторлар класс айнымалыларын инициализациялауға және жадыдан орын бөлуге арналған айрықша функция болып табылады.
Конструктор бірінші кезекте кластың айнымалыларын инициализациялау және жадыны сақтауға арналған кластың ерекше түрдегі функция- мүшесін құрайды. Конструкторлар аты ол тиесілі кластың атымен сәйкес келеді. Конструкторлар аргументті қабылдап және қайта жүктеуі мүмкін. Класс объектісін құру кезінде қажетті конструктор автоматты түрде шақырылады. Егер класты сипаттау кезінде конструктор берілмесе, онда компилятор класс үшін қалыпты конструкторды генеризациялайды.
Конструктор көмегімен айнымалы – мүшелерді инициализациялау. Конструкт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 сілтегішіне объект адресін меншіктейді. Бұл жағдайда объектіде ат жоқ, бірақ объектілерін жұмыс істеуде сілтегішті қолдануға болады. Конструкторды қолдану кластың өзге әдістерінен ерекшеленеді. Сонда да, конструкторды шақыру үшін объектіні қолдануға болмайды, себебі конструктор нақтылы объектіні құрастыру бойынша жұмысын бітірмейінше, мұндай объект болмайды. Конструктор объектімен шақырылуы мүмкін емес, конструктор объектіні жасауға қолданылады.
- Конструктор түрлері
Бір класста бірнеше конструктор болуы мүмкін. Конструкторлардың үш түрі бар:
- Қалыпты жағдайда конструкторлардың параметрлері болмайды. Егер класстың құрамында бірде-бір конструктор болмаса, онда компилятор автоматты түрде бір конструкторды құрады. Оның қызметі — класс объектісін құру кезде жады бөлу.
- Аргументі бар конструктор объектті құру мезгілінде инициализациялауға мүмкіндік береді (әртүрлі функцияларды шақыру, динамикалық жады бөлу, айнымалыларға бастапқы мәндер меншіктеу т.с.с).
- Көшіру конструкторы класс объектісінен мәліметтерді көшіру арқылы осы класстың басқа объектілерін құрады.
Қалыпты жағдайда берілген конструктор. Қалыпты жағдайда берілген конструктор дегеніміз – инициализациялауға арналған айқын мәндер болмаған кезде объект құруға пайдаланылатын конструктор. Басқаша айтқанда, конструктор мынадай түрдегі жариялауға қолданылады: 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);
}
}
- Деструкторлар
Деструкторлар деп — өшірілген объекті орын алатын динамикалық жадыны босату үшін қызмет ететін тағыда бір арнайы функция- мүшелер айтылады.
Деструктор да конструтор сияқты префикс ретінде тильда ( ~ ) белгісі бар класс атын ұстанады. Деструктор бағдарламада класс объектісіне сілтегіші бар delete операторы кездескенде және объект өзінің көзге көрінетін обылыстан тыс шығып кеткен кезде автоматты түрде шақырылады. Конструкторлардан ерекшелігі Деструкторлар ешқандай аргументтерді қабылдамайды. Және қайта жүктеуі мүмкін емес. Егер деструктор түсінікті берілмесе, компилятор класқа қарапайым деструкторын ұсынады.
Егер объектіні құруда конструктор қолданылса, бағдарлама бұл объектіге жүктелген міндетін орындамайынша бағдарлама оны бақылап отырады. Осы кезде бағдарлама деструктор барлық қалған «қоқысты» жою керек, осылайша ол деструктор да , таза конструкторлық міндеттерді орындайды. Мысалы, егер сіздің конструктор жадыны бөлу үшін new спецификаторын қолданса, деструтор delete операторының көмегімен жадыны босатады. Stock конструторы ешқандай ерекше әрекет жасамайды, мысалы, New спецификаторын қолданбайды, сондықтан оған деструктор керек емес. Алайда ең болмаса кластың кейінгі тексерістері үшін мұндай функцияның болғаны жаман болмас еді.
Деструктордан қашан көмек сұраған жөн? Бұл шешімді компилятор қабылдайды, сіздің бағдарламалық кодыңызда деструкторға айқын қаратпалар болмауы керек. Егер сіз статикалық класс жады бар объект жасап жатсаңыз, онда оның деструкторы бағдарламаны орындау соңында автоматты түрде шақырылады. Егер сіз автоматты класс жады бар жасап жатсаңыз, онда оның дестркуторы бағдарлама объект анықталған бағдарламаның код блогынан шыққан кезде автоматты түрде шақырылады. Егер объект new спецификаторын қолдану арқылы құрылса, ол жадының динамикалық бөлінетін обылысында немесе бос жадыда орналасады, ал оның деструкторы жадыны босату үшін delete операторын қолдану қажет болған кезде автоматты түрде уақытша объектілерді құруы мүмкін; бұл жағдайда бағдаралама объектіні қолданып болған кезде оны – жою үшін автоматты түрде деструкторды шақырады.
Класс объетісі қызмет етіп болған кезде деструктор автоматты түрде шақырылатындықтан, деструктор әрқашан дайын тұруы керек. Егер сіз өзіңіздің деструкторыңызды қарастырып қоймасаңыз, компилятор үндемей берілетін ешқандай әрекет орындалмайтын деструкторды ұсынады.
Бақылау сұрақтары:
- Конструктор дегеніміз не?
- Конструктордың қандай түрлері бар?
- Деструктор қандай қызмет атқарады?
- Конструктор мен деструктордың айырмашылығы неде?
Әдебиеттер:
- Павловская Т.А. С и С++. Программирование на языке высокого уровня.
- Г.С. Иванова и др. ООП: Учебник для вузов, М., Изд-во МГТУ им.Баумана, 2003.- 368 с.
- Бьерн Страуструп. Язык программирования С++. Третье издание. — М.: Изд. Бином, Невский Диалект, 1999.
- Р. Лафоре. Объектно-ориентированное программирование в С++.4-е издание. Питер.2004