5.3 Konstruktor va destruktor. Sinf statik komponentlari Konstruktor - bu sinf obyektlarini avtomatik initsializatsiya qilish uchun
ishlatiladigan maxsus komponentali funksiya. Konstruktorlar kurinishi quyidagicha
bulishi mumkin:
()
{}
Bu komponenta funksiya nomi sinf nomi bilan bir xil bulishi lozim.
Dasturchi tomonidan ko‘rsatilmagan holda ham new operator yordamida sinf
obyekti yaratilganda yoki xotirada joylashganda konstruktor avtomatik ravishda
chaqiriladi.
Konstruktor obyekt uchun xotirada joy ajratadi va ma’lumotlar – sinf a’zolarini
initsializatsiyalaydi.
Konstruktor bir nechta xususiyatlarga ega:
Konstruktorlar uchun kaytariluvchi tiplar, xatto void tipi ham ko‘rsatilmaydi
Konstruktor adresini hisoblash mumkin emas. Konstruktor parametri sifatida
uz sinfining nomini ishlatish mumkin emas, lekin bu nomga ko‘rsatkichdan
foydalanish mumkin.
50
Konstruktorlar vorislikga ega emas.
Konstruktorlar ixtiyoriy sinflar uchun doimo mavjud, lekin agarda u ko‘rsatilgan
holda tavsiflanmagan bo‘lsa, u avtomatik ravishda yaratiladi. Ko‘rsatilmagan holda
parametrsiz konstruktor va nusxa konstruktori yaratiladi. Agarda konstruktor ochiq
holda tavsiflangan bo‘lsa, unda ko‘rsatilmagan holda konstruktor yaratilmaydi.
Ko‘rsatilmagan holda umumiy (public) konstruktorlar yaratiladi.
Konstruktorni oddiy komponenta funksiya sifatida chakirib bulmaydi.
Konstruktorni ikki xil shaklda chakirish mumkin :
Birinchi shakl ishlatilganda xakikiy parametrlar ruyxati bush bulmasligi lozim.
Bu shakldan yangi obyekt ta’riflanganda foydalaniladi:
Konstruktorni ikkinchi shaklda chakirish nomsiz obyekt yaratilishiga olib keladi.
Bu nomsiz obyektdan ifodalarda foydalanish mumkin.
Misol:
include class complex
{
double re, im; // private ko‘zda tutilgan bo‘yicha
public:
void show ();
somplex(double re1 = 0.0,double im1 = 0.0){re = re1; im = im1;}
};
inline void complex::show() { cout << "re=" << re<<"im=" << im;}
void main()
{ complex ss (5.9,0.15);
complex aa = complex (5.9,0.15);
aa.show(); }
Konstruktor yordamida obyekt ma’lumotlarni initsiyalizatsiyalashni ikkita usuli
mavjud:
51
Birinchi usulda parametrlar qiymatlari konstruktor tanasiga uzatiladi. Ikinchi
usulda esa ushbu sinfdagi initsializatorlar ro‘yxatidan foydalanish nazarda tutilgan.
Bu ro‘yxat parametrlar ro‘yxati va konstruktor tanasi orasiga joylashadi.
Sinfning biror obyekti uchun ajratilgan xotira obyekt yo‘qotilgandan so‘ng
bo‘shatilishi lozimdir. Sinflarning maxsus komponentalari destruktorlar, bu vazifani
avtomatik bajarish imkonini yaratadi. Destruktorni standart shakli quyidagicha:
~ ( ) {}
Destruktor parametri yoki kaytariluvchi qiymatga ega bo‘lishi mumkin emas
(xatto void tipidagi). Dastur obyektni o‘chirganda destruktor avtomatik chaqiriladi.
Agarda sinfda destruktor ochiq ko‘rsatilmagan bo‘lsa, unda kompilyator
ko‘rsatilgan obyekt egallagan xotirani bo‘shatuvchi destruktorni generatsiyalaydi.
Boshqa obyektlar egallagan xotirani bo‘shatmoqchi bo‘lsak, destruktorni ochiq
aniqlash lozim. Masalan, string obyektdagi ch ko‘rsatgan saxifani
“Simvol satri” sinfi.
class string
{
char *ch; // matnli satriga ko‘rsatkich
int len; // matnli satrni uzunligi
public:
// konstruktorlar
// bo‘sh satr – obyektni yaratish
string(int N = 80): len(0){ch = new char[N+1]; ch[0] = ‘\0’;}
// berilgan satr bo‘yicha obyekt yaratadi
string(const char *arch){len = strlen(arch);
ch = new char[len+1]; strcpy(ch,arch);}
// funksiyalar – komponentlar
// murojaatni satr uzunligiga qaytaradi
int& len_str(void){return len;}
// ko‘rsatkichni satrga qaytaradi
char *str(void){return ch;}