Statik usullar
Statik usullar sinf statik maydonlarga murojaat qilish uchun mo’ljallangan. Ular bevosita statik maydonlarga murojaat qilishi mumkin va faqat sinfning boshqa statik usullarini chaqirishi mumkin, chunki ularga yashirin ko’rsatgich this uzatilmaydi. Statik usullarga murojaat statik maydonlarga murojaat kabi yi sinf nomi, yoki agar sinfning hech bo’lmaganda bitta obyekti yaratilgan bo’lsa, obyekt nomi orqali amalga oshiriladi.
class А{
static int count; // count - yashirin maydon
public:
static void inc_count(){ count++; }
…
};
…
A::int count; // Global sohadagi ta’rif
void f(){
А а;
// a.count++ - mumkin emas, count yashirin maydon
// Statik usul yordamida nomni o’zgartirish;
a.inc_count(); // yoki А::inc_count();
}
Statik usullar konstant (const) va virtual (virtual) bo’lishlari mumkin emas.
Do’stona funksiyalar va sinflar
Ba’zida sinfning yashirin maydonlariga bevosita kirish, ya’ni sinf interfeysini kengaytirish zarur bo’ladi. Buning uchun do’stona funksiyalar va do’stona sinflar xizmat qiladi.
Do’stona funksiya
Do’stona funksiya sinf yashirin maydonlariga kirish uchun qo’llaniladi va usullarga muqobil hisoblanadi. Usul odatda obyekt xossasini amalga oshirish uchun qo’llaniladi, do’stona funksiya ko’rinishida sinf xossalarini taqdim etmaydigan, lekin uning interfeysiga kiruvchi va uning yashirin maydonlariga kirishga muhtoj, masalan, obyektlarni chiqarishning ortiqcha aniqlangan amallari rasmiylashtiriladi.
Quyida do’stona funksiyaning tavsiflash qoidalari va xususiyatlari sanab o’tilgan:
Do’stona funksiya elementlari friend tayanch so’zi bilan kirish zarur bo’lgan sinf ichida e’lon qilinadi. Unga parametr sifatida obyekt yoki sinfning obyektga murojaat berilishi lozim, chunki this ko’rsatgich unga berilmaydi.
Do’stona funksiya boshqa oldin aniqlangan sinfning oddiy funksiyasi yoki usuli bo’lishi mumkin. Unda kirish spetsifikatori amal qilmaydi. Uning sinfda e’lon qilinish joyining farqi yo’q.
Bitta funksiya birdaniga bir nechta sinfga do’stona bo’lishi mumkin.
Misol sifatida quyida monstr sinfiga do’stona ikkita funksiya tavsifi keltirilgan. kill funksiyadi hero sinfi usuli hisoblanadi, steal_ammo funksiyasi hech bir sinfga tegishli emas. Ikkala funksiyaga parametr sifatida monstr sinfi obyektiga murojaat beriladi.
class monstr; // Sinfning dastlabki e’loni
class hero{
public:
void kill(monstr &);
…
};
class monstr{
…
friend int steal_ammo(monstr &);
friend void hero::kill(monstr &);
// hero sinfi oldin aniqlanishi lozim
};
int steal_ammo(monstr &M){return --M.ammo; }
void hero::kill(monstr &M){M.health = 0; M.ammo = 0;}
Do’stona funksiyalardan foydalanishni imkoniboricha qochish lozim, chunki ular inkapsulyatsiya prinsipini buzadi va shuning uchun dasturlarni sozlash va takomillashtirishni qiyinlashtiradi.
Do'stlaringiz bilan baham: |