Кіріспе

Объект құру үшін шақырылатын арнайы функция. Сыныпқа негізделген, объектіге бағытталған бағдарламалауда конструктор (қысқаша: ctor) — объект құру үшін шақырылатын функцияның ерекше түрі. Ол жаңа объектіні пайдалануға дайындап, көбінесе конструктор қажетті мүшелік айнымалыларды орнату үшін пайдаланатын аргументтерді қабылдайды. Конструктор инстанция әдісіне ұқсас, бірақ ол әдістен айырмашылығы, нақты қайтарым түрі болмайды, жасырын түрде мұрагерлікке ұшырамайды және әдетте ауқым модификаторлары үшін басқаша ережелерге ие. Конструкторлардың атауы көбінесе оны жариялаған сыныптың атауымен сәйкес келеді. Олардың міндеті — объектінің дерек мүшелерін инициализациялау және сыныптың инвариантын орнату, егер инвариант жарамсыз болса, операция сәтсіз аяқталады. Дұрыс жазылған конструктор нәтижедегі объектіні жарамды күйде қалдырады. Өзгертілмейтін объектілер конструкторда инициализациялануы керек. Көптеген тілдер конструкторды жүктеуге мүмкіндік береді, яғни бір сынып үшін әртүрлі параметрлермен бірнеше конструктор болуы мүмкін. Кейбір тілдер конструкторлардың ерекше түрлерін қарастырады. Объектілерді құру үшін нақты бір сыныпты пайдаланатын және сыныптың жаңа инстанциясын қайтаратын конструкторлар фабрикалармен абстракцияланады, олар да объектілерді жасайды, бірақ бірнеше сыныптарды немесе объектілер пулы сияқты әртүрлі бөлу схемаларын пайдаланып, түрлі жолдармен жасай алады.

Көшірме жасаушылар

C++ сияқты, Java да "Көшіру конструкторын" қолдайды. Бірақ, C++-тан айырмашылығы, Java өзіңіз жазбасаңыз, автоматты түрде көшіру конструкторын жасамайды. Көшіру конструкторлары сынып объектілерін көшірген кезде компилятордың қандай әрекеттер атқаратынын анықтайды. Көшіру конструкторының бір формальды параметрі болады, ол кластың типімен сәйкес келеді (параметр объектіге сілтеме болуы мүмкін). Ол бірдей кластың қолданыстағы объектісінің көшірмесін жасау үшін пайдаланылады. Екі класс бірдей болғанына қарамастан, бұл конверсиялық конструктор болып саналады. Көшіру конструкторлары көбінесе "көшіру ctor" немесе "cctor" деп қысқартылса да, олардың .NET-те сол қысқартуды қолданатын класс конструкторларымен ешқандай қатысы жоқ.

Конверсиялық конструкторлар

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

Жылжыту конструкторлары

C++-да жылжыту конструкторлары кластың объектісіне Rvalue сілтемесін қабылдайды және параметр объектісінің ресурстарын иеленуге беруді жүзеге асыру үшін қолданылады.

Синтаксисі

Java, C++, C#, ActionScript, PHP 4 және MATLAB конструкторлары өздеріне байланысты кластармен бірдей атауға ие атау конвенциясын қолданады. PHP 5-те конструктордың ұсынылатын атауы – construct. Артқа қарай үйлесімділік үшін, егер construct әдісі табылмаса, кластың атауымен бірдей атауға ие әдіс шақырылады. PHP 5.3.3 нұсқасынан бастап, бұл тек атау кеңістігі жоқ кластар үшін ғана жұмыс істейді. PHP 7-де конструкторды әрқашан construct деп атау керек. Кластың атауымен бірдей атауға ие әдістер E DEPRECATED деңгейіндегі қатеге әкеледі. Perl-де конструкторлар, әдетте, "new" деп аталады және объектіні құрудың маңызды бөлігін орындауы керек. Perl үшін Moose объектілік жүйесінде конструкторлар (new деп аталады) автоматты түрде құрылады және BUILD әдісін көрсету арқылы кеңейтіледі. Visual Basic NET-те конструктор "New" деп аталады. Python-да конструктор екі әдіске бөлінеді: "new" және "init". new әдісі инстанция үшін жадты бөлуге жауапты және класты аргумент ретінде қабылдайды (әдетте "cls" деп аталады). init әдісі (көбінесе "инициализатор" деп аталады) жаңадан құрылған инстанцияны аргумент ретінде қабылдайды (әдетте "self" деп аталады). Object Pascal конструкторлары "constructor" кілт сөзімен белгіленеді және пайдаланушы анықтаған атауларға ие болуы мүмкін (бірақ көбінесе "Create" деп аталады). Objective-C-де конструктор әдісі екі әдіске бөлінеді: "alloc" және "init". alloc әдісі кластың инстанциясы үшін жадты бөліп қояды (бөледі), ал init әдісі инстанцияны бастаудың басым бөлігін орындайды. "new" әдісін шақыру кластың инстанциясы үшін alloc және init әдістерін шақырады.

Жадты ұйымдастыру

Java, C# және VB NET-те конструктор сілтемелі типтегі объектілерді "үйінді" деп аталатын арнайы жад құрылымында жасайды. Мән типтері (мысалы, int, double және т.б.) "стек" деп аталатын тізбекті құрылымда құрылады. VB NET және C# сонымен қатар new операторын мән типтегі объектілерді құру үшін пайдалануға мүмкіндік береді, бірақ бұл мән типтегі объектілер оператор қолданылсын-қолданбасын, стекте құрылады. C++-та объектілер конструкторды new операторсыз шақырғанда стекте құрылады, ал конструкторды new операторымен шақырғанда үйіндіде құрылады. Стектегі объектілер ауқымнан шыққанда автоматты түрде жойылады, ал үйіндідегі объектілер деструктор арқылы автоматты түрде немесе delete операторы арқылы қолмен жойылуы керек.