Standart kutubxona nomlar fazosi. Standart kutubxona obyektlari std nomlar fazosida aniqlangan. Masalan, e'lon qilingan C ning kiritish/chiqarish vositalari sarlavha faylda nomlar fazosida quyidagicha joylashgan:
// stdio.h
namespace std{
int feof(FILE *f);
…
}
using namespace std;
Bu yuqoridan pastga muvofiqlikni ta'minlaydi. Oshkora bo'lmagan erishiluvchi nomlar bo'lmasligini hohlaganlar uchun yangi sarlavha fayli aniqlangan.
// cstdio
namespace std{
int feof(FILE *f);
…
}
Agar dasturda fayl kiritilgan bo'lsa, nomlar fazosining nomini osjkora kiritish lozim:
std::feof(f);
Nomlar fazosi mexanizmi #include buyrug'i bilan birgalikda katta dasturlarni yozishda zarur puxtalikni bog'langan miqdorlarni mantiqiy guruhlash va kirishni cheklashni o'zaro muvofiqlash yo'li bilan ta'minlaydi.
Odatda dasturning ixtiyoriy funksional chegaralangan qismida intefeys qismni ajratish mumkin (masalan, funksiyalar sarlavhasi,tiplar tavsifi), bu esa bu parchadan foydalanish uchun zarur, ya'ni tashqaridan kirish talab etilmaydigan yordamchi o'zgaruvchilar, funksiyalar va boshqa vositalar. Nomlar fazosi amalga oshirish tafsilotlarini yashirishga imkon beradi va demak, dastur tuzilishini soddalashtiradi va potensial xatolarni kamaytiradi. Dasturni oqilona modullarga ajratish, interfeyslarni aniq vazifalarini belgilash va kirishni chegaralash dasturchilar guruhining loyiha ustida samarali ishlashini tashkil etishga imkon beradi.
3-bob
SINFLAR
Bu bobda har qanday obyekt – yo’naltirilgan dastur-obyektlarni tavsiflash sintaksis qoidalarni yozish uchun asosiy poydevor qaraladi.
Sinf tavsifi
Sinf foydalanuvchi tomonidan aniqlangan ma’lumotlar abstrakt tipi bo’lib ular bilan ishlash uchun ma’lumotlar va funksiyalar ko’rinishidagi real obyektning modelidan iborat.
Sinf ma’lumotlari maydonlar deb (struktura maydonlariga o’xshash) sinf funksiyalari – usullar deb ataladi. Maydonlar va usullar sinf elementlari deb ataladi. Birinchi yaqinlashishda sinf tavsifi quyidagi ko’rinishda bo’ladi:
class {
[ private: ]
public:
}; // Tavsif nuqtali vergul bilan tugaydi
Kirish spetsifikatorlari private va public sinf elementlari ko’rinishini boshqaradi. private so’zidan keyin tavsiflangan elementlar faqat sinf ichida ko’rinadi. Bu kirish usuli sinfda jimlik bo’yicha qabul qilingan. Sinf interfeysi public spetsifikatoridan keyin tavsiflanadi. Ixtiyoriy spetsifikator amali keyingi spetsifikatorgacha yoki sinfning oxirigacha bajariladi. Bir nechta private va public seksiyalarini berish mumkin, ularning joylashish tartibi ahamiyatga ega emas.
Sinf maydonlari:
bu sinfning tipidan boshqa har qanday tipga ega bo’lishi mumkin (lekin bu sinfga ko’rsatgich yoki murojaat bo’lishi mumkin);
const modifikatori bilan tavsiflanishi mumkin, bunda faqat bir marta initsializatsiyalanadi (konstruktor yordamida) va o’zgarishi mumkin emas;
static modifikatori bilan tavsiflanishi mumkin, lekin auto, extern va registr kabi emas.
Tavsiflashda maydonlarni initsializatsiyalashga yo’l qo’yilmaydi.
Sinflar global (ixtiyoriy blokdan tashqari e’lon qilingan) va lokal (blok ichida e’lon qilingan, masalan, funksiyalar yoki boshqa sinf) bo’lishi mumkin.
Quyida lokal sinfning ba’zi xususiyatlari sanab o’tilgan:
lokal sinf ichida tiplarni statik (static) va tashqi (extern) o’zgaruvchilarni u tavsiflangan sohadagi funksiyalar va sanash elementlaridan foydalanish mumkin; bu sohadan avtomatik o’zgaruvchilardan foydalanish man etiladi;
lokal sinf statik elementlarga ega bo’lishi mumkin emas;
bu sinfning usullari faqat sinf ichida tavsiflanishi mumkin;
agar bir sinf ikkinchisiga ichma-ich joylashgan bo’lsa, ular bir-birining elementlariga kirishda qandaydir maxsus imtiyozga ega emas va ularga faqat umumiy qoidalar bo’yicha murojaat qilishi mumkin.
Misol sifatida kompyuter o’yin personajini modellashtiruvchi sinfni yaratamiz. Buning uchun uning xossalarini (granatomet uskunalari, kuchi yoki mavjudligi) va harakat holatini berish talab etiladi. Tabiiyki, misol sxema shaklida bo’ladi, chunki sintaksisni namoyish etish uchun qo’llaniladi.
class monstr{
int health, ammo;
public:
monstr(in the = 100, int am = 10) { health = he; ammo = am;}
void draw(int x, int y, int scale, int position);
int get_health( ) { return health; }
int get_ammo( ) { return ammo; }
};
Bu sinfda ikkita yashirin maydon – health va ammo, ularning qiymatlarini tashqaridan get_health() va get_ammo() usullar yordamida olish mumkin. Bu holda usullar yordamida maydonlarga kirish sun’iy murakkablashgandek tuyuladi, lekin real sinflar maydonlari bo’lib murakkab dinamik strukturalar bo’lishi mumkin va elementlardan qiymatlarni olish unchalik oson ish emas. Bundan tashqari, juda muhimi bu strukturalarga sinf interfeysini qamrab olmasdan kirish imkoniyati mavjudligi hisoblanadi.
Sinfning barcha usullari uning yashirin maydonlariga bevosita kirishga ega, boshqacha aytganda, sinf funksiyalari sinf elementlari private ko’rinish sohasiga kiradi.
Keltirilgan sinfda usullarning uchta ta’rifi va bitta e’loni (draw usuli) bor. Agar usul jismi sinf ichida aniqlangan bo’lsa, u ichga joylashgan (inline) hisoblanadi. Odatda qisqa usullar ichga joylashgan bo’ladi. Agar sinf ichida faqat usul e’loni (sarlavha) yozilgan bo’lsa, usulning o’zi ko’rinish sohasiga kirish amali yordamida dasturning boshqa joyida aniqlanishi mumkin (::):
void monstr::draw(int x, int y, int scale, int position){
/* usul tanasi */
}
Usulni yana sinfdan tashqarida ichga joylashgan tarzda inline buyrug’i yordamida aniqlanishi mumkin (boshqa funksiyalar kabi u tavsiya etiluvchi xarakterga ega):
inline int monstr::get_ammo(){
return ammo;
}
Har bir sinfda nomi sinf nomi bilan ustma-ust tushuvchi hech bo’lmaganda bitta usul mavjud. U konstruktor deb ataladi va sinfning obyektini yaratishda avtomatik chaqiriladi. Konstruktor obyektni initsializatsiyalash uchun mo’ljallangan. Konstruktorni avtomatik chaqirish initsializatsiyalanmagan o’zgaruvchilardan foydalanish bilan bog’liq xatolarga yo’l qo’ymaslikka imkon beradi.
struct va union ma’lumotlar tiplari sinf turlari hisoblanadi.