Nusxalash konstruktori
Nusxalash konstruktori – bu sinfning obyektiga ko’rsatgichicha yagona parametr sifatida olingan konstruktorni maxsus turi hisoblanadi:
T::T(const Т&){ ... /* Kostruktor tanasi */ }
bu yerda Т – sinf nomi.
Bu konstruktor yangi obyekt mavjudlarini nusxalash yo’li bilan yaratiladigan hollarda chaqiriladi.
yangi obyektni boshqa obyektlarini initsializatsiyalash bilan tavsiflashda;
obyektni qiymat bo’yicha funksiyaga uzatishda;
funksiyadan obyektni qaytarishda.
Agar dasturni birorta ham nusxalash konstruktorini ko’rsatmagan bo’lsa, kompilyator uni avtomotik yaratadi. Bunday konstruktor maydonidagi elementlari bo’yicha nusxalashni bajaradi. Agar sinf ko’rsatgichlar yoki murojaatlarni o’z ichiga olsa, bu noto’g’ri bo’ladi, chunki nusxa ham, original ham bitta xotira sohasini ko’rsatadi.
monstr sinfi uchun nusxalash konstruktorini yozamiz. Unda simvollar satriga ko’rsatgichni o’z ichiga oluvchi name maydoni bo’lgani uchun nusxalash konstruktor yangi satrga xotira ajratishi va unga berilganini nusxalashi lozim:
monstr::mcnstr(const monstr &М) {
if (M.name) {
name = new char [strlen(M.name) + 1];
strcpy(name, M.name);}
else name = 0;
health = M.health; ammo = M.ammo; skin = M.skin;
}
…
monstr Vasia(blue);
monstr Super = Vasia; // Nusxalash konstruktori ishlaydi
monstr *m = new monstr ("Orc");
monstr Green = *m; // Nusxalash konstruktori ishlaydi
Sinfning statik elementlari
static modifikator yordamida sinfning statik maydon va usullarini tavsiflash mumkin. Ularni global o’zgaruvchilar yoki funksiyalar deb qarash mumkin, ularga faqat sinf chegaralarida kirish mumkin.
Statik maydonlar
Statik maydonlar sinfning barcha obyektlari uchun umumiy ma’lumotlarni, masalan, obyektlar yoki barcha obyektlar bilan ajratiluvchi resursga murojaatlar soni, saqlash uchun qo’llaniladi. Bu maydonlar barcha obyektlari uchun yagona nusxada mavjud, ya’ni ko’paytirilmaydi.
Statik maydonlarning quyidagi xususiyatlari mavjud.
Statik maydonlarga xotira bir marta uni yaratilgan obyektlar soniga bog’liq bo’lmagan holda initsializatsiyalashda ajratiladi (hatto ular bo’lmaganda ham) va tanlash amali bilan emas, amal qilish sohasiga kirish amali yordamida initsializatsiyalashda (ta’rif funksiyalardan tashqarida yozilishi lozim):
class А{
public:
static int count; // Sinfda e’lon
};
…
int A::count; // Global sohadagi ta’rif
// Jimlik bo’yicha nol bilan intsializatsiyalanadi
// int A::count = 10; Ixtiyoriy qiymat bilan initsializatsiyalash misoli
Statik maydonlarga sinf nomi orqali ham, obyektlar nomi orqali kirish mumkin:
А *а, b;
…
cout << A::count << a → count << b.count;
// Будет выведено одно и то жe
Statik maydonda kirish spetsifikatori amal qiladi, shuning uchun private kabi tavsiflangan statik maydonlarni amal qilish sohasiga kirish amali yordamida o’zgartirish mumkin emas. Buni faqat statik usullar yordamida bajarish mumkin.
Statik maydon egallagan xotira sizeof amali yordamida obyekt o’lchamini aniqlashda hisobga olinmaydi.
Do'stlaringiz bilan baham: |