Номлар фазоси
Маълумки, программага қўшилган сарлавҳа файлларида эълон қилинган идентификатор ва константалар компилятор томонидан ягона глобал номлар фазосига киритилади. Агар программа кўп миқдордаги сарлавҳа файлларни ишлатса ва ундаги идентифаакторлар (функция номлари ва ўзгарувчилар номлари, синфлар номлари ва ҳакозалар) ва ўзгармаслар номлари турли программа тузувчилар томонидан мустақил равишда аниқланган бўлса, бир хил номларни ишлатиш билан боғлиқ муаммолар юзага келиши мумкин. Номлар фазоси тушунчасини киритилиши мазкур муаммони маълум бир маънода ҳал қилишга ёрдам беради. Агар программада янги идентификаторни аниқлаш керак бўлса ва худди номни бошқа модулларда ёки кутубхоналарда ишлатиши хавфи бўладиган бўлса, бу идентификаторлар учун ўзининг шахсий номлар фазосини аниқлаш мумкин. Бунга учун nanespace калит сўзидан фойдаланилган ҳолда эришилади:
namespace <номлар фазоси номи>
{
// эълонлар
…
}
Номлар фазоси ичида эълон қилинган идентификаторлар фақат <номлар фазоси номи> кўриниш соҳасида бўлади ва юзага келиши мумкин бўлган келишмовчиликларни олдини олади.
Мисол тариқасида қуйидаги номлар фазосини яратайлик:
namespace Shaxsiy_nomlar
{
int x,y, z;
void Mening_functsiyam(char belgi);
}
Компиляторга конкрет номлар фазосидаги номларни ишлатиш кераклигини кўрсатиш учун кўринишга рухсат бериш амалидан фойдаланиш мумкин:
Shaxsiy_nomlar::x=5;
Агар программа матнида конкрет номлар фазосига нисбатан кўп мурожаат қилинадиган бўлса using namespace қурилмасини ишлатиш орқали ёзувни соддалаштириш мумкин:
using namespace <номлар фазоси номи>;
Масалан,
using namespace Shaxsiy_nomlar;
кўрсатмаси компиляторга, бундан кейин токи навбатдаги using учрамагунча Shaxsiy_nomlar фазосидаги номлар ишлатилиши кераклигини билдиради:
x=0; y=z=10;
Mening_functsiyam(‘A’);
Программа ва унга қўшилган сарлавҳа файллар томонидан аниқлаган номлар фазоси std деб номланади. Агар стандарт фазога ўтиш керак бўлса
using namespace std;
кўрсатмаси берилади.
Агар бирорта номлар фазосидаги айрим номга мурожаат қилиш зарур бўлса using қурилмасини бошқа шаклида фойдаланилади. Мисол учун
using namespace std;
using namespace Shaxsiy_nomlar::х;
кўрсатмаси х идентификаторини Shaxsiy_nomlar фазосидан ишлатиш кераклигини билдиради.
Шуни қайд қилиш керакки, using namespae қурилмаси стандарт номлар фазоси кўриниш соҳасини беркитади ва ундаги номга мурожаат қилиш учун кўринишга рухсат бериш амалидан (std::) фойдаланиш зарур бўлади.
Номлар фазоси функция ичида эълон қилиниши мумкин эмас, лекин улар бошқа номлар фазоси ичида эълон қилиниши мумкин. Ичма – ич жойлашган номлар фазосидаги идентификаторга мурожаат қилиш учун уни қамраб олган барча номлар фазоси номлари кўрсатилиши керак. Мисол учун, қуйидаги кўринишда номлар фазоси эълон қилинган бўлсин:
namespace Yuqori
{
…
namespace Urta
{
…
namespace Ichki
{
int Ichki_n;
}
}
}
Ichki_n ўзгарувчисига мурожаат қуйидаги кўринишда бўлади:
Yuqori::Urta::Ichki::Ichki_n=0;
Номлар фазосида функцияни эълон қилишда номлар фазосида фақат функция прототипини эълон қилиш ва функция танасини бошқа жойда эълон қилиш маъқул вариант ҳисобланади. Бу ҳолатнинг кўринишига мисол:
namespace Nomlar_fazosi
{
char c;
int I;
void Functsiya(char Bayroq);
}
void Nomlar_fazosi::Functsiya(char Bayroq)
{
// функция танаси
}
Умуман олганда номга эга бўлмаган номлар фазосини эълон қилиш мумкин. Бу ҳолда namespace калит сўзидан кейин ҳеч нима ёзилмайди. Мисол учун
namespace
{ char c_nomsiz;
int i_nomsiz;
}
кўринишидаги номлар фазоси элементларига мурожаат ҳеч бир префикс ишлатмасдан амалга оширилади. Номсиз номлар фазоси фақат ўзи эълон қилинган файл чегарасида амал қилади.
С++ номлар фазосининг псевдонимларини аниқлаш имконини беради. Бу йўл орқали номлар фазоси номини бошқа ном билан ишлатиш мумкин бўлади. Масалан, номлар фазоси номи узун бўлганда унга қисқа ном билан мурожаат қилиш:
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: |