olish(kolliziyasaqlanish) uchun identifikatorlarning nomlarini lokalizatsiya qilish
uchun mo‘ljallangan.
C++dasturlash
muhitida,o‘zgaruvchan nomlari aql bovar qilmaydigan bir qator
operatorlari, funksiyalari, metodlari va sinflar mavjud.Nomlar
fazosi tushunchasi
kiritilishidan oldin, bu nomlarning barchasi bir xil global nomlar bo‘lib, ko‘plab
nizolarni (xatoliklarni, o‘zaro bir xilliklarni)keltirib chiqargan. Agar dasturda dasturchi
o‘zining toupper()funksiyasini yaratgan bo‘lsa, masalan, agar, u(uning parametrlari
ro‘yxatiga qarab) standart kutubxona toupper(),funksiyasini almashtirish mumkin.
Ammo,ikkala funuksiyalarning nomlari bir xil global namespaceda saqlangan
bo‘ladi.Bir xil dasturlarni turli ishlab chiqaruvchilarning
funksiyalari va
sinflar,kutubxonalar foydalanganda nomlar bir xil bo‘lgan funksiyalar dastur
bajarilishida ziddiyatlarga duch keladi.
Bunday holda,bir kutubxonada aniqlangan nomlar boshqa kutubxonada aniqlangan
nomlar bilan to‘qnashishi mumkin.Barcha muammolar nomlar fazosi tushunchasi va
namespace kalit so‘z tomonidan halqilindi.Bu kalit so‘z yangi nomlar fazosi eʻlon
qilish
orqali barcha funksiya,sinf va kutubxonalarni mahalliylashtirish imkonini
beradi.Bu nomlar fazosi turli kontekstlarda bir xil nomdagi funksiya va sinflar
ziddiyatga olib kelmasdan ishlatish imkonini beradi. std standart kutubxona (std -
Standart Library) juda ko‘p foydalanilgan bo‘lishi mumkin.Tilning
dastlabki
variantlarida C++ kutubxonasi global nomlar fazosida belgilangan.Sezilarli nomlar
ziddiyatlari ehtimolini kamaytirish uchun std namespace nomlar fazosi yaratilgan.
Bundan tashqari,ziddiyatlarni oldini olish uchun nomlar fazosi ko‘lamini
mahalliylashtirish uchun dasturda o‘z nomfazongizni yaratishingiz mumkin.Bu
shaxsiy sinf yoki funksiya
kutubxonalar yaratishda, ayniqsa,muhim ahamiyatga
ega.Namespace kalit so‘zi nomlar fazosida sohalarni qo‘shib global namespacedan
ajratish imkonini beradi. Aslida,bir nomlar fazosi doirasi belgilaydi. Namespace kalit
so‘zidan foydalanishning asosiy shakli quyida ko‘rsatilgan:
namespace Space{
//....
}
Misol:Nomlar fazosini yaratish va foydalanish.
#include "stdafx.h" #include
using namespace std; // birinchi nomlar fazosi
namespace NS1{
class demo{
int i; public: demo(int x) { i=x; } void set(int x) { i=x; } int get() { return i; }
}; char str[] = "Nomlar fazolarini oʻrnatish\n"; int counter;
}
// ikkinchi nomlar fazosi namespace NS2 { int x, u; } int main(){ NS1::demo ob(10);
cout <<" ob = " << ob.get() << endl; ob.set(99);
cout << "Endi ob = "<< ob.get() << endl; using NS1::str; cout << str; using namespace
NS1; for(counter = 1; counter<=10; counter++) cout << counter << ends; cout << endl;
NS2::x = 10; NS2::u = 20;
cout << "oʻzgaruvchilar x, y = "<< NS2::x<<", "
<< NS2::u<< endl; using namespace NS2; demo x_ob(x), y_ob(u); cout << "x_ob,
y_ob ob’ektlarning qiymati: "<< x_ob.get(); cout<< " " << y_ob.get() << endl;
system("pause");
return 0; }
Dastur natijasi:
ob = 10 Endi ob = 99
Nomlar fazolarini oʻrnatish 1 2 3 4 5 6 7 8 9 10 oʻzgaruvchilar x, y = 10, 20 x_ob, y_ob
ob’ektlarning qiymati: 10 20 Dasturda bir muhim nuqta ko‘rsatilgan:
bir nechta
nomlarn ibirgalikda ishlatganda, bir nomni boshqasi almashtirmaydi.
Hozirgi fragmentda baʻzi nomlarni kiritganingizda, uning nomlari o‘sha paytda boshqa
nomdagi nomlarning o‘zida bo‘lishidan qatʻi nazar, bu fragmentda qo‘shiladi. Shunday
qilib,dastur bajarilayotgan vaqtda, std, NS1 va NS2namespaces
global namespace
bo‘lib qo‘shildi.Yuqorida aytib o‘tilganidek,fayllar orasida yoki bitta fayl ichida
nomlar fazosini ajratish
mumkin,keyin
esa
bu
nomlar
fazosining
a’zolarini
mazmunan
birlashtiriladi.Birgalikda nomlar fazosini birlashtirish misolini ko‘rib chiqamiz.
Namespace larni birlashtirish.
#include "stdafx.h" #include
using namespace std; namespace Demo { int
a; // Demo fazoda a oʻzgaruvchi
} int x; // Global fazoda x oʻzgaruvchi namespace Demo { int b; // Demo fazoda b
oʻzgaruvchi
}
using namespace Demo;
int main(){ a = b = x = 101;
cout << a << " " << a << " " << x << endl; system("pause"); return 0;
}
Dastur natijasi:
101 101 101