this ko’rsatgichi
Har bir obyekt o’zining sinf maydonlari nusxasiga ega. Sinf usullari yagona nusxada xotirada joylashgan va barcha obyektlar bilan birgalikda foydalaniladi, shuning uchun qaysi obyekt uchun mo’ljallab chaqirilgan bo’lsa, o’sha obyektning maydonlari bilan usullarning ishlashini ta’minlashi zarur. Bu yashirin parameter this ning funksiyasiga uzatish bilan ta’minlanadi, unda funksiya chaqirgan obyektga constant ko’rsatgich saqlanadi. this ko’rsatgich usul ichida obyekt elementlariga murojaatlar uchun oshkormas tarzda foydalaniladi. Oshkor holda bu ko’ratgich asosan chaqirilgan obyektga ko’rsatgich (return this:) yoki murojaat (return *this:) usulida qaytarish uchun ishlatiladi.
this ko’rsatgich foydalanishni namoyish etish uchun yuqorida keltirilgan monstr sinfiga biri usulni chaqiradigan, ikkinchisi unga parameter sifatida beriladigan ikkita monstrdan eng sog’lomrog’i (health maydoni) ga murojaatni qaytaruvchi yangi usulni qo’shamiz (usulni sinf tavsifining public seksiyasiga joylashtirish mumkin):
monstr & the_best(monstr &М){
if ( health > М.health) return *this;
return M;
}
… monstr Vasia(50), Super(200);
// Best yangi obyekt Super maydonlar qiymatlari bilan initsializatsiyalanadi:
Monstr Best = Vasia.the_best(Super);
this ko’rsatgichni sinf maydonini identifikatsiyalash uchun uning nomi usulning formal parametrik nomi bilan ustma-ust tushgan holda ham qo’llaniladi. Maydonni identifikatsiyalashning boshqa yo’li ko’rinish sohasiga kirish amalidan faydalanadi:
void cure(int health, int ammo){
this → health += health; // thisdan foydalanish
monstr:: ammo += ammo; // :: amaldan foydalanish
}
Konstruktorlar
Konstrukrtor obyektni initsializatsiyalash uchun mo’ljallangan va uni yaratishda avtomatik chaqiriladi. Quyida konstruktorlarning asosiy xossalari sanab o’tilgan:
Konstruktor qiymatni qaytarmaydi hatto void tipida bo’lsa ham. Konstruktordan ko’rsatgich olish mumkin emas.
Sinf turli ko’rinishdagi initsializatsiyalar uchun turlicha parametrli bir nechta konstruktorga ega bo’lishi mumkin (bunda ortiqcha yuklash mexanizmi ishlatiladi).
Parametrlarsiz chaqiriladigan konstruktor jimlik bo’yicha konstruktor deb ataladi.
Konstruktorning parametrlari bu sinfdan tashqari ixtiyoriy tipga ega bo’lishi mumkin. Jimlik bo’yicha parametrlar qiymatlarini berish mumkin. Ularni konstruktorlardan faqat bittasi o’z ichiga olishi mumkin.
Agar dasturchi birorta ham konstruktorni ko’rsatmagan bo’lsa, u holda kompilyator uni avtomatik yaratadi. Bunday konstruktor sinf maydonlari uchun jimlik bo’yicha konstruktorlarni va bazaviy sinflarning jimlik bo’yicha konstruktorlarini chaqiradi. Sinf konstanta va iqtiboslarni (murojaatlarni) o’z ichiga olgan holda, sinf obyektini yaratishga urinishda xato chiqariladi, chunki ularni konkret qiymatlar bilan initsializatsiyalash zarur, jimlik bo’yicha konstruktor esa buni bajara olmaydi.
Konstruktorlardan meros qolmaydi.
Konstruktorlarni const, virtual va static modifikatorlar bilan tavsiflash mumkin emas.
Global obyektlar konstruktorlari main funksiyasi chaqirilguncha chaqiriladi. Lokal obyektlar ularning amallar sohasi faol bo’lgandan so’ng yaratiladi. Konstruktor vaqtinchalik obyektni yaratishda ham ishga tushiriladi (masalan, funksiyadan obyektni uzatishda).
Konstruktor agar dasturda qandaydir sintaksis konstruksiyalar uchraganda ham chaqiriladi:
sinf_nomi obyekt_nomi [(parametrlar ro’yxati)];
// Parametrlar ro’yxati bo’sh bo’lishi mumkin emas
sinf_nomi (parametrlar ro’yxati):
// Nomsiz obyekt yaratiladi (ro’yxat bo’sh bo’lishi mumkin)
sinf_nomi obyekt_nomi = ifoda;
// Nomsiz obyektlar yaratiladi va nusxalanadi
Misollar:
monstr Super(200, 300), Vasia(50), Z;
monstr X = monstr(1000);
monstr Y = 500;
Birinchi obyektda uchta obyekt yaratiladi. Ko’rsatilmagan parametrlar qiymatlari jimlik bo’yicha o’rnatiladi.
Ikkinchi operatorda health = 1000 parametr qiymatli nomsiz obyekt yaratiladi (ikkinchi parametr qiymati jimlik bo’yicha o’rnatiladi). X obyektga xotira ajratiladi, unga nomsiz obyekt nusxalanadi.
Oxirida operatorda health = 500 parametr qiymatli nomsiz obyekt yaratiladi (ikkinchi parametr qiymati jimlik bo’yicha o’rnatiladi). Y obyekt uchun xotira ajratiladi, unga nomsiz obyekt nusxa qilinadi. Obyektning yaratishning bunday shakli obyektni initsializatsiyalash uchun bitta parametrni beriladigan holda mumkin bo’ladi.
Bir nechta konstruktorni sinfga misol sifatida yuqorida tavsiflangan monstr sinfini unga rang (skin) va nom (name) beruvchi maydonlarni qo’shib takomillashtiramiz:
enum color{red,green,blue}; // Rangning mumkin bo’lgan qiymatlari
class monstr {
int health, ammo ;
color skin;
char *name;
public:
monstr (in the = 100, int am = 10);
monstr (color sk);
monstr (char * nam);
int get_health(){return health;}
int get_ammo(){return ammo;}
…
};
//---------------------------------------
monstr::monstr(int he, int am){
health = he; ammo = am; skin = red; name = 0;
}
//---------------------------------------
monstr::monstr(color sk){
switch (sk){
case red : health = 100; ammo = 10; skin = red; name = 0; break;
case green : health = 100; ammo = 20; skin = green; name = 0; break;
case blue : health = 100; ammo = 40; skin = blue; name = 0; break;
}
}
//--------------------------------------
monstr::monstr(char * nam){
name=newchar[strlen(nam)+1] ;
// nol-simvolni saqlash uchun satr uzunligiga 1 qo’shiladi
strcpy(name, nam):
health = 100; ammo = 10; skin = red;
}
…
//---------------------------------------
monstr * m = new monstr ("Ork");
monstr Green (green);
Yuqorida keltirilgan konstruktorlardan birinchisi jimlik bo’yicha konstruktor hisoblanadi, chunki uni parametrlarsiz chaqirish mumkin. monstr sinf obyektlarini turlicha usullar bilan initsializatsiyalash mumkin, talab qilinuvchi konstruktor qavslardagi qiymatlar ro’yxatiga bog’liq ravishda chaqiriladi. Bir nechta konstruktorlar berilganda ortiqcha yuklanishli funksiyalarni yozishdagi kabi qoidalarga rioya qilish lozim – kompilyatorda zarur variantni topib olish imkoniyati bo’lishi lozim.
Konstruktorda maydonlarni initsializatsiyalashning yana bir usuli mavjud (yuqorida keltirilgan dasturda foydalanilgan maydonlarga formal parametrlar qiymatlarini berishdan tashqari) – sarlavha va konstruktor jismi orasidagi ikki nuqtadan keyin joylashgan initsializatorlar yordamida:
monstr::monstr(int he, int am);
health (he), ammo (am), skin (red), name (0){ }
Maydonlar vergul orqali sanab o’tiladi. Har bir maydon uchun qavslarda ifoda bo’lishi mumkin bo’lgan initsializatsiyalanuvchi qiymat ko’rsatiladi. Bu usulsiz konstanta-maydon, murojaat-maydonlar va obyektlar-maydonlarini initsializatsiya qilib bo’lmaydi. Oxirgi xolda qavslarda ko’rsatilgan parametrlarga mos konstruktor chaqiriladi.
Do'stlaringiz bilan baham: |