Nomlar fazosi
Ma’lumki, programmaga qo’shilgan sarlavha fayllarida e’lon qilingan identifikator va konstantalar kompilyator tomonidan yagona global nomlar fazosiga kiritiladi. Agar programma ko’p miqdordagi sarlavha fayllarni ishlatsa va undagi identifaaktorlar (funktsiya nomlari va o’zgaruvchilar nomlari, sinflar nomlari va hakozalar) va o’zgarmaslar nomlari turli programma tuzuvchilar tomonidan mustaqil ravishda aniqlangan bo’lsa, bir xil nomlarni ishlatish bilan bog’liq muammolar yuzaga kelishi mumkin. Nomlar fazosi tushunchasini kiritilishi mazkur muammoni ma’lum bir ma’noda hal qilishga yordam beradi. Agar programmada yangi identifikatorni aniqlash kerak bo’lsa va xuddi nomni boshqa modullarda yoki kutubxonalarda ishlatishi xavfi bo’ladigan bo’lsa, bu identifikatorlar uchun o’zining shaxsiy nomlar fazosini aniqlash mumkin. Bunga uchun nanespace kalit so’zidan foydalanilgan holda erishiladi:
namespace
{
// e’lonlar
…
}
Nomlar fazosi ichida e’lon qilingan identifikatorlar faqat ko’rinish sohasida bo’ladi va yuzaga kelishi mumkin bo’lgan kelishmovchiliklarni oldini oladi.
Misol tariqasida quyidagi nomlar fazosini yarataylik:
namespace Shaxsiy_nomlar
{
int x,y, z;
void Mening_functsiyam(char belgi);
}
Kompilyatorga konkret nomlar fazosidagi nomlarni ishlatish kerakligini ko’rsatish uchun ko’rinishga ruxsat berish amalidan foydalanish mumkin:
Shaxsiy_nomlar::x=5;
Agar programma matnida konkret nomlar fazosiga nisbatan ko’p murojaat qilinadigan bo’lsa using namespace qurilmasini ishlatish orqali yozuvni soddalashtirish mumkin:
using namespace ;
Masalan,
using namespace Shaxsiy_nomlar;
ko’rsatmasi kompilyatorga, bundan keyin toki navbatdagi using uchramaguncha Shaxsiy_nomlar fazosidagi nomlar ishlatilishi kerakligini bildiradi:
x=0; y=z=10;
Mening_functsiyam(‘A’);
Programma va unga qo’shilgan sarlavha fayllar tomonidan aniqlagan nomlar fazosi std deb nomlanadi. Agar standart fazoga o’tish kerak bo’lsa
using namespace std;
ko’rsatmasi beriladi.
Agar birorta nomlar fazosidagi ayrim nomga murojaat qilish zarur bo’lsa using qurilmasini boshqa shaklida foydalaniladi. Misol uchun
using namespace std;
using namespace Shaxsiy_nomlar::x;
ko’rsatmasi x identifikatorini Shaxsiy_nomlar fazosidan ishlatish kerakligini bildiradi.
Chuni qayd qilish kerakki, using namespae qurilmasi standart nomlar fazosi ko’rinish sohasini berkitadi va undagi nomga murojaat qilish uchun ko’rinishga ruxsat berish amalidan (std::) foydalanish zarur bo’ladi.
Nomlar fazosi funktsiya ichida e’lon qilinishi mumkin emas, lekin ular boshqa nomlar fazosi ichida e’lon qilinishi mumkin. Ichma – ich joylashgan nomlar fazosidagi identifikatorga murojaat qilish uchun uni qamrab olgan barcha nomlar fazosi nomlari ko’rsatilishi kerak. Misol uchun, quyidagi ko’rinishda nomlar fazosi e’lon qilingan bo’lsin:
namespace Yuqori
{
…
namespace Urta
{
…
namespace Ichki
{
int Ichki_n;
}
}
}
Ichki_n o’zgaruvchisiga murojaat quyidagi ko’rinishda bo’ladi:
Yuqori::Urta::Ichki::Ichki_n=0;
Nomlar fazosida funktsiyani e’lon qilishda nomlar fazosida faqat funktsiya prototipini e’lon qilish va funktsiya tanasini boshqa joyda e’lon qilish ma’qul variant hisoblanadi. Bu holatning ko’rinishiga misol:
namespace Nomlar_fazosi
{
char c;
int I;
void Functsiya(char Bayroq);
}
void Nomlar_fazosi::Functsiya(char Bayroq)
{
// funktsiya tanasi
}
Umuman olganda nomga ega bo’lmagan nomlar fazosini e’lon qilish mumkin. Bu holda namespace kalit so’zidan keyin hech nima yozilmaydi. Misol uchun
namespace
{ char c_nomsiz;
int i_nomsiz;
}
ko’rinishidagi nomlar fazosi elementlariga murojaat hech bir prefiks ishlatmasdan amalga oshiriladi. Nomsiz nomlar fazosi faqat o’zi e’lon qilingan fayl chegarasida amal qiladi.
S++ nomlar fazosining psevdonimlarini aniqlash imkonini beradi. Bu yo’l orqali nomlar fazosi nomini boshqa nom bilan ishlatish mumkin bo’ladi. Masalan, nomlar fazosi nomi uzun bo’lganda unga qisqa nom bilan murojaat qilish:
namespace Juda_uzun_nomli_fazo
{
float y;
}
Juda_uzun_nomli_fazo::y=0;
namespace Qisqa_nom= Juda_uzun_nomli_fazo;
Qisqa_nom::y=13.2;
Do'stlaringiz bilan baham: |