Menný priestor C ++

C Namespace



Menný priestor v C ++ je zovšeobecnený rozsah. Jeho deklarácia začína vyhradeným slovom, priestorom mien, nasleduje názov podľa výberu programátora a potom blok v zátvorkách. Blok obsahuje základné deklarácie a/alebo definície objektov, funkcií a ďalších entít C ++.

V nasledujúcom programe zvážte nasledujúce dve skalárne vyhlásenia v globálnom rozsahu:







#zahrnúť
pomocou priestoru názvov std;

intvarId= 5;
plavákvarId= 2.3;

intHlavná()
{

vrátiť sa 0;
}

Pokus o kompiláciu tohto programu vedie k chybe pri kompilácii. Existujú dve premenné s rovnakým názvom, varId . Hoci ide o dve rôzne premenné dvoch rôznych typov, int a plavák , kompilátor odmietne dve deklarácie, pretože majú rovnaký názov. Nasledujúci program rieši tento problém tak, že deklaruje premenné s rovnakým názvom v dvoch rôznych zovšeobecnených rozsahoch:



#zahrnúť
pomocou priestoru názvov std;

priestor mien NA
{
intvarId= 5;
}

menný priestor Pozn
{
plavákvarId= 2.3;
}

intHlavná()
{
náklady<<NA::varId << ' n';
náklady<<Pozn::varId << ' n';

vrátiť sa 0;
}

Výstup je nasledujúci:



5
2.3

Vo vyššie uvedenom programe sú dva menné priestory: NA , ktorý má definíciu celého čísla, a Pozn , ktorý má definíciu float, ale s rovnakým názvom ako celé číslo pre NA. Nakoniec, keď bol program spustený, bol použitý rovnaký názov pre dve rôzne premenné. Upozorňujeme, že na prístup k rovnakému názvu dvoch rôznych premenných je potrebné použiť konkrétny názov priestoru názvov, za ktorým nasleduje spoločný identifikátor. Názov priestoru názvov a spoločný identifikátor sú oddelené operátorom rozlíšenia rozsahu, :: . Názov priestorov názvov bude odlišovať objekty.





Tento článok sa zaoberá základným konceptom priestoru názvov a jeho používaním v programovacom jazyku C ++. Ak sa chcete riadiť týmto článkom, mali by ste mať základné znalosti jazyka C ++. Mali by ste mať tiež znalosti o rozsahu C ++, aj keď je to stručne vysvetlené v tomto článku. Ak sa chcete dozvedieť viac o rozsahu C ++, vyhľadajte frázu Rozsah v C ++ (bez úvodzoviek) vo vyhľadávacom poli na akejkoľvek webovej stránke linuxhint.com a stlačte kláves Enter. Dostanete sa tak k článku, ktorý autor napísal.

Obsah článku

Čo je to menný priestor?

Deklaratívna oblasť je najväčšia časť programu, v ktorom platí názov entity (premennej). Tento región sa nazýva rozsah. Menný priestor v C ++ je zovšeobecnený rozsah, ktorého hlavným účelom je riešenie konfliktov mien. Menný priestor má základné deklarácie a/alebo definície entít.



Globálny menný priestor a jeho problém

Globálny priestor názvov je globálny rozsah. Zvážte nasledujúci krátky program:

#zahrnúť
pomocou priestoru názvov std;

intident= 55;
plavákident= 12.17;

intHlavná()
{

vrátiť sa 0;
}

Vo vyššie uvedenom programe existujú dve premenné, obe nazývané ident . Tieto premenné sú v globálnom rozsahu; to znamená, že sú v globálnom priestore názvov. Pokus o kompiláciu tohto programu zlyhá s chybovým hlásením. Globálny rozsah neakceptuje viac ako jednu premennú s rovnakým názvom, preto je potrebný vlastný priestor názvov.

Vlastný priestor názvov

Menný priestor nemá iba jedno meno. Namiesto toho má priestor názvov sadu mien, aby sa zabránilo konfliktu s inými súbormi mien. Aby ste sa vyhli konfliktu v kóde, zadajte pred každý názov názov priestoru názvov a :: . Nasledujúci program to ilustruje pomocou dvoch vlastných priestorov názvov:

#zahrnúť
pomocou priestoru názvov std;

priestor mien NA
{
intVARIANT= 6;
plavákflt;
}

menný priestor Pozn
{
intVARIANT= 7;
plavákflt;
}

intHlavná()
{
náklady<<NA::VARIANT << ' n';
náklady<<Pozn::VARIANT << ' n';
NA::flt = 2.5;
Pozn::flt = 4.8;
náklady<<NA::flt << ' n';
náklady<<Pozn::flt << ' n';

vrátiť sa 0;
}

Výstupom je:

6
7
2.5
4.8

Všimnite si toho, že mená NA :: flt a Dôležité upozornenie: pod boli nakoniec definované v Hlavná() funkciu. C ++ neumožňuje takúto definíciu v globálnom rozsahu.

Všimnite si toho, že vlastný priestor názvov je vnorený priestor názvov pre globálny priestor názvov.

Smernica o používaní

Aby ste sa vyhli zadávaniu názvu, priestoru a názvu namiesto deklarovania priestoru názvov, môžete použiť príponu použitím smernice. Syntax na použitie použitím smernica je nasledovná:

pomocou priestoru názvov Namespace_name;

The použitím direktíva nie je direktíva preprocesora, takže končí bodkočiarkou (;).

Nasledujúci program ukazuje použitie použitím smernica a ďalšie:

#zahrnúť
pomocou priestoru názvov std;

menný priestor Pozn
{
intVARIANT= 7;
intfunkciu()
{
vrátiť saVARIANT;
}
}

intfn()
{
pomocou priestoru názvov Pozn;
intmyVar2=funkciu();
// nasledujú ďalšie objekty a funkcie z NB.
vrátiť samyVar2;
}

intmyVar3=Pozn::funkciu();

intHlavná()
{
náklady<<fn() << '' <<myVar3<< ' n';

vrátiť sa 0;
}

Výstupom tohto programu je 7 7 . Termín používanie priestoru názvov NB; bol umiestnený na začiatku fn () definícia. The func () z priestoru názvov NB sa nazýva tesne pod tým, bez predchádzajúceho znaku Poznámka: .

Premenná deklarovaná v globálnom rozsahu (globálny priestor názvov) je viditeľná od bodu deklarácie do konca súboru. Je to tiež vidieť vo vnorených priestoroch názvov (vnorené rozsahy), ako sú vnorené fn () rozsah funkcií vyššie. The použitím direktíva spája svoj menný priestor z pozície, na ktorej je umiestnená, na koniec rozsahu, v ktorom je umiestnená.

Názov func () z menného priestoru NB nie je vidieť pod fn () definícia, pretože používanie priestoru názvov NB; bol umiestnený do funkčného rozsahu (blok). Za tejto podmienky používať func () mimo bloku (rozsahu) oboru názvov NB, musí mu predchádzať znak Poznámka: , ako v nasledujúcom vyhlásení:

intmyVar3=Pozn::funkciu();

The použitím direktíva spája svoj priestor názvov s vonkajším priestorom názvov vnorenia z polohy, v ktorej je umiestnený, na koniec vonkajšieho priestoru názvov vnorenia. V nasledujúcom programe je menný priestor NA spojený s globálnym priestorom názvov. Oba menné priestory sa potom rozšíria do súboru fn () priestor názvov definície funkcie, v ktorom sú spojené s priestorom názvov NB. Priestor názvov NB končí na konci fn () definícia funkcie a dva predchádzajúce priestory názvov pokračujú až do konca súboru (prečítajte si kód).

#zahrnúť
pomocou priestoru názvov std;

priestor mien NA
{
intVARIANT= 6;
intfunkciu()
{
vrátiť saVARIANT;
}

}

menný priestor Pozn
{
intVARIANT= 7;
intfunkciu()
{
vrátiť saVARIANT;
}
}

pomocou priestoru názvov NA;
intmyVar0=VARIANT;
// nasledujú ďalšie objekty a funkcie z :: a NB.

intfn()
{
intmyVar1=VARIANT;
pomocou priestoru názvov Pozn;
intmyVar2=Pozn::funkciu();
// ostatné objekty a funkcie z NB nasledujú až do konca tohto rozsahu.
vrátiť samyVar1+myVar2;
}

// Nasledujú iba objekty a funkcie z :: a NB.

intmyVar3=Pozn::funkciu();

intHlavná()
{
náklady<<myVar0<< '' <<fn() << '' <<myVar3<< ' n';

vrátiť sa 0;
}

Výstup je 6, 13, 7 .

Poznámka: Globálny priestor názvov je označený symbolom :: , čo znamená, že pred operátorom rozlíšenia rozsahu neexistuje nič, čo nasleduje.

Pod vyhlásením je používanie priestoru názvov NA; premenné z globálneho priestoru názvov a priestorov názvov NA je možné použiť bez uvedenia ich zdrojového priestoru názvov. Nasledujúce vyhlásenie používa príponu VARIANT priestoru názvov NA. Globálna a NA kombinovaná oblasť názvov zasahuje do fn () priestor názvov funkcií. Takže VARIANT prvého vyhlásenia v fn () rozsah funkcií, je z názvového priestoru NA.

Pretože región globálnych názvov a názvov NA sa rozprestiera po celom fn () rozsah, po int myVar2 = NB :: func (); , akékoľvek meno z priestoru názvov NB je možné použiť iba v fn () rozsah bez toho, aby to predchádzalo s Poznámka: , iba ak sa nevyskytuje v NA a globálnych priestoroch názvov (blokoch). V opačnom prípade by mu malo predchádzať znamienko Poznámka: . Oblasť kombinovaných názvov pre NA a globálne pokračuje pod fn () definície a do Hlavná() fungovať až do konca súboru.

Rozšírenie priestoru názvov NB začína od int myVar2 = NB :: func (); v fn () bloku a končí na konci fn () definičný blok.

Poznámka: Priestory názvov, ktorých oblasti sú spojené, by nemali mať v rôznych blokoch priestoru názvov rovnaký názov premennej, pretože by to stále spôsobilo konflikt.

Menné priestory

Menný priestor je rozsah. Okrem globálneho priestoru názvov (globálneho rozsahu) by mal byť akýkoľvek priestor názvov deklarovaný v bloku. Tento blok je prvou časťou potenciálne distribuovaných oblastí oboru názvov. Pomocou direktívy using možno priestor názvov rozšíriť ako oblasti v iných oblastiach.

O entitách deklarovaných v tele priestoru názvov sa hovorí, že sú členmi priestoru názvov, a názvy zavedené týmito deklaráciami do deklaratívnej oblasti priestoru názvov sa nazývajú členské mená priestoru názvov.

Vnorené menné priestory

Nasledujúci program zobrazuje vnorené priestory názvov:

#zahrnúť
pomocou priestoru názvov std;

priestor mien A
{
inti= 1;
priestor mien B
{
inti= 2;
priestor mien C
{
inti= 3;
}
}
}

intHlavná()
{
náklady<<TO::i << '' <<TO::B::i << '' <<TO::B::C.::i << ' n';

vrátiť sa 0;
}

Výstupom je:

1 2 3

Všimnite si, že k trom hodnotám bolo prístupných pomocou operátora rozlíšenia rozsahu.

Štandardný priestor názvov

C ++ má knižnicu nazývanú štandardná knižnica. Názvy objektov, funkcií a ďalších entít v tejto knižnici pochádzajú z priestoru názvov nazývaného štandardný priestor názvov, zapísaný ako hodiny . Štandardná knižnica obsahuje podknižnice a jedna z týchto podknižníc je iostream . The iostream knižnica obsahuje objekt náklady , ktorý slúži na odosielanie výsledkov do konzoly (terminálu).

Názov náklady musí byť v hodiny priestor mien. Použit iostream s tým hodiny priestor názvov, program by mal byť nasledujúci:

#zahrnúť
pomocou priestoru názvov std;

Všimnite si použitia použitím smernice a hodiny . Termín #zahrnúť je direktíva preprocesora a nekončí bodkočiarkou. Obsahuje súbor iostream na mieste svojej smernice.

Záver

Menný priestor je rozsah. Popis (definícia) priestoru názvov obsahuje základné deklarácie a/alebo definície objektov, funkcií a ďalších entít C ++. Mimo definície priestoru názvov je k názvu prístupné pomocou syntaxe, namespaceName :: name . Okrem globálneho priestoru názvov (globálneho rozsahu) by mal byť akýkoľvek priestor názvov deklarovaný v bloku. Tento blok je prvou časťou potenciálne distribuovaných oblastí oboru názvov. S použitím smernice, je možné menný priestor rozšíriť ako oblasti v iných oblastiach. Priestory názvov, ktorých oblasti sú spojené, by nemali mať v rôznych blokoch priestoru názvov rovnaký názov premennej, pretože by to stále spôsobilo konflikt názvov.

Chrys