Ц ++ Простор имена

C Namespace



Простор имена у Ц ++ је генерализовано подручје. Његова декларација почиње резервисаном речју, именским простором, након чега следи име по избору програмера, а затим блок у заградама. Блок садржи основне декларације и/или дефиниције Ц ++ објеката, функција и других ентитета.

Размотрите следеће две скаларне изјаве у глобалном опсегу, у следећем програму:







#инцлуде
користећи именски простор стд;

интварИд= 5;
пловакварИд= 2.3;

интглавни()
{

повратак 0;
}

Покушај компајлирања овог програма доводи до грешке при превођењу. Постоје две променљиве са истим именом, варИд . Иако су то две различите променљиве два различита типа, инт и пловак , компајлер одбацује две декларације јер су истог имена. Следећи програм решава овај проблем декларисањем променљивих са истим именом у два различита генерализована опсега:



#инцлуде
користећи именски простор стд;

именски простор НА
{
интварИд= 5;
}

именски простор НБ
{
пловакварИд= 2.3;
}

интглавни()
{
цена<<НА::варИд << ' н';
цена<<НБ::варИд << ' н';

повратак 0;
}

Излаз је следећи:



5
2.3

У горњем програму постоје два именска простора: НА , који има дефиницију целог броја, и НБ , који има дефиницију флоат -а, али са истим именом као и цео број за НА. Коначно, када је програм покренут, коришћен је исти назив за две различите променљиве. Имајте на уму да за приступ истом имену две различите променљиве мора да се користи одређени назив за именски простор, иза којег следи заједнички идентификатор. Име простора имена и заједнички идентификатор раздвојени су оператором резолуције опсега, :: . Називи именских простора ће разликовати објекте.





Овај чланак покрива основни концепт простора имена и његову употребу у програмском језику Ц ++. Да бисте пратили овај чланак, требало би да имате основно знање језика Ц ++. Такође би требало да познајете опсег Ц ++, иако је то укратко објашњено у овом чланку. Да бисте сазнали више о опсегу Ц ++, потражите израз, Опсег у Ц ++ (без наводника) у пољу за претрагу било које веб странице линукхинт.цом и притисните Ентер. Ово ће вас одвести до чланка који је овај аутор написао.

Садржај чланка

Шта је простор имена?

Декларативна регија је највећи део програма у коме је назив ентитета (променљива) важећи. Овај регион се назива дометом. Простор имена у Ц ++ је општи опсег чија је главна сврха решавање сукоба имена. Простор имена има основне декларације и/или дефиниције ентитета.



Глобални простор имена и његов проблем

Глобални простор имена је глобални опсег. Размотрите следећи кратки програм:

#инцлуде
користећи именски простор стд;

интидент= 55;
пловакидент= 12.17;

интглавни()
{

повратак 0;
}

У горњем програму постоје две променљиве, обе позване идент . Ове променљиве су у глобалном опсегу; односно налазе се у глобалном простору имена. Покушај компајлирања овог програма неће успјети са поруком о грешци. Глобални опсег не прихвата више од једне променљиве са истим именом, па постоји потреба за прилагођеним простором имена.

Прилагођени простор имена

Простор имена нема само једно име. Уместо тога, простор имена има скуп имена како би се избегао сукоб са другим скуповима имена. Да бисте избегли сукоб ниже у коду, пре сваког имена унесите назив имена и :: . Следећи програм то илуструје помоћу два прилагођена простора имена:

#инцлуде
користећи именски простор стд;

именски простор НА
{
интварИнт= 6;
пловакфлт;
}

именски простор НБ
{
интварИнт= 7;
пловакфлт;
}

интглавни()
{
цена<<НА::варИнт << ' н';
цена<<НБ::варИнт << ' н';
НА::флт = 2.5;
НБ::флт = 4.8;
цена<<НА::флт << ' н';
цена<<НБ::флт << ' н';

повратак 0;
}

Излаз је:

6
7
2.5
4.8

Имајте на уму да су имена НА :: флт и НБ :: флт су коначно дефинисане у главни() функција. Ц ++ не дозвољава такву дефиницију у глобалном опсегу.

Имајте на уму да је прилагођени простор имена угнијежђени простор имена за глобални простор имена.

Директива о употреби

Да бисте избегли уписивање именског простора :: име све време уместо само имена након декларисања именског простора, можете користити Користећи директивом. Синтакса за коришћење Користећи директива је следећа:

користећи именски простор Намеспаце_наме;

Тхе Користећи директива није предпроцесорска директива, па се завршава тачком и зарезом (;).

Следећи програм илуструје употребу Користећи директива и више:

#инцлуде
користећи именски простор стд;

именски простор НБ
{
интварИнт= 7;
интфункција()
{
повратакварИнт;
}
}

интфн()
{
користећи именски простор НБ;
интмиВар2=функција();
// следе други објекти и функције из НБ.
повратакмиВар2;
}

интмиВар3=НБ::функција();

интглавни()
{
цена<<фн() << '' <<миВар3<< ' н';

повратак 0;
}

Резултат овог програма је 7 7 . Термин коришћење простора имена НБ; стављен је на почетак фн () дефиниција. Тхе фунц () из простора имена НБ позива се испод тога, без претходника НБ :: .

Променљива која је декларисана у глобалном опсегу (глобални простор имена) гледа се од тачке декларације до краја датотеке. Такође се види у угнежђеним именским просторима (угнежђеним опсезима), попут угнежђених фн () опсег функције изнад. Тхе Користећи директива придружује свој именски простор од позиције на којој је постављена до краја опсега у који је постављена.

Име фунц () из простора имена НБ не може се видети испод фн () дефиниција јер коришћење простора имена НБ; стављен је у оквир функције (блок). Под овим условом, за употребу фунц () изван блока простора назива (опсег) НБ, мора му претходити НБ :: , као у следећој изјави:

интмиВар3=НБ::функција();

Тхе Користећи директива спаја свој именски простор са спољним угнежђеним именским простором од позиције на којој је постављена до краја спољног гнездећег именског простора. У следећем програму, НА именски простор је спојен са глобалним именским простором. Оба именска простора се затим проширују у фн () именски простор дефиниције функције, у којем су спојени са именским простором НБ. Простор имена НБ завршава се на крају фн () дефиниција функције, а два претходна именска простора се настављају до краја датотеке (прочитајте код).

#инцлуде
користећи именски простор стд;

именски простор НА
{
интварИнт= 6;
интфункција()
{
повратакварИнт;
}

}

именски простор НБ
{
интварИнт= 7;
интфункција()
{
повратакварИнт;
}
}

користећи именски простор НА;
интмиВар0=варИнт;
// следе други објекти и функције из :: и НБ.

интфн()
{
интмиВар1=варИнт;
користећи именски простор НБ;
интмиВар2=НБ::функција();
// следе други објекти и функције из НБ до краја овог опсега.
повратакмиВар1+миВар2;
}

// Следе само објекти и функције из :: и НБ.

интмиВар3=НБ::функција();

интглавни()
{
цена<<миВар0<< '' <<фн() << '' <<миВар3<< ' н';

повратак 0;
}

Излаз је 6, 13, 7 .

Белешка: Глобални простор имена означен је са :: , што значи да нема ничега испред оператора резолуције опсега који следи.

Испод изјаве, коришћење имена простора НА; променљиве из глобалног и НА именског простора могу се користити без назнаке њиховог изворног именског простора. Следећа изјава користи варИнт простора имена НА. Глобални и НА комбиновани регион именског простора простире се на фн () именски простор функције. Дакле, варИнт прве изјаве у фн () опсег функције, припада НА именском простору.

Будући да се регион за глобални и НА именски простор протеже кроз цео фн () опсег, након инт миВар2 = НБ :: фунц (); , било које име из простора имена НБ може се користити само у фн () опсег без претходног приказивања НБ :: , само ако се то није догодило у НА и глобалним именским просторима (блоковима). У супротном, требало би да му претходи НБ :: . Регија комбинованих именских простора за НА и глобално наставља се испод фн () дефиниција и у главни() функцију до краја датотеке.

Проширење простора имена НБ почиње од инт миВар2 = НБ :: фунц (); у фн () блок и завршава се на крају фн () блок дефиниције.

Белешка: Простори имена чији су региони спојени не би требали имати исти назив променљиве у различитим блоковима именског простора, јер би то и даље изазвало сукоб.

Регије простора простора

Простор имена је опсег. Осим глобалног простора имена (глобални опсег), сваки простор имена треба бити декларисан у блоку. Тај блок је први део могуће дистрибуираних региона простора имена. Помоћу директиве, именски простор се може проширити као региони у другим опсезима.

За ентитете декларисане у телу именског простора каже се да су чланови именског простора, а за имена која се овим декларацијама уносе у декларативну регију именског простора каже се да су то имена имена простора имена.

Уметнути простори имена

Следећи програм приказује угнежђене просторе имена:

#инцлуде
користећи именски простор стд;

именски простор А.
{
инти= 1;
именски простор Б.
{
инти= 2;
именски простор Ц.
{
инти= 3;
}
}
}

интглавни()
{
цена<<ДО::и << '' <<ДО::Б::и << '' <<ДО::Б::Ц.::и << ' н';

повратак 0;
}

Излаз је:

1 2 3

Обратите пажњу на то да се до три вредности приступило помоћу оператора резолуције опсега.

Стандардни простор имена

Ц ++ има библиотеку која се зове стандардна библиотека. Називи објеката, функција и других ентитета у овој библиотеци потичу из простора имена који се назива стандардни простор имена, написан као сати . Стандардна библиотека садржи под-библиотеке, а једна од ових под-библиотека је иостреам . Тхе иостреам библиотека садржи објекат цена , који се користи за слање резултата на конзолу (терминал).

Име цена мора бити у сати именски простор. Користити иостреам са својим сати именског простора, програм би требао бити следећи:

#инцлуде
користећи именски простор стд;

Обратите пажњу на употребу Користећи директива и сати . Термин #инцлуде је предпроцесорска директива и не завршава се тачком и зарезом. Укључује иостреам датотеку на месту своје директиве.

Закључак

Простор имена је опсег. Опис именског простора (дефиниција) садржи основне декларације и/или дефиниције Ц ++ објеката, функција и других ентитета. Изван дефиниције простора имена, имену се може приступити са синтаксом, намеспацеНаме :: наме . Осим глобалног простора имена (глобални опсег), сваки простор имена треба бити декларисан у блоку. Тај блок је први део могуће дистрибуираних региона простора имена. Са Користећи директиве, именски простор се може проширити као региони у другим опсезима. Простори имена чији су региони спојени не би требали имати исти назив променљиве у различитим блоковима именског простора, јер би то и даље изазвало сукоб имена.

Цхрис