C ++

Menný priestor C ++

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

Zvážte nasledujúce dva skalárne príkazy v globálnom rozsahu v nasledujúcom programe:

#include
pomocou namespace std;
int varId = 5;
float varId = 2.3;
int main ()

návrat 0;

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

#include
pomocou namespace std;
menný priestor NA

int varId = 5;

menný priestor NB

float varId = 2.3;

int main ()

cout << NA::varId << '\n';
cout << NB::varId << '\n';
návrat 0;

Výstup je nasledovný:

5
2.3

Vo vyššie uvedenom programe sú dva menné priestory: NA, ktorá má definíciu celého čísla a NB, ktorý má definíciu plaváka, 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 mien, 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 menných priestorov bude objekty odlišovať.

Tento článok sa venuje základnému konceptu priestoru mien a jeho použitiu 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ž vedomosti o rozsahu C ++, aj keď sú v tomto článku stručne vysvetlené. Ak sa chcete dozvedieť viac informácií o rozsahu C ++, vyhľadajte frázu „Rozsah v C ++“ (bez úvodzoviek) vo vyhľadávacom poli ľubovoľného linuxhintu.com a stlačte kláves Enter. To vás dovedie k článku, ktorý tento autor napísal.

Obsah článku

Čo je to menný priestor?

Deklaratívna oblasť je najväčšia časť programu, v ktorej je platný názov entity (premennej). Tento región sa nazýva rozsah. Obor názvov v C ++ je zovšeobecnený rozsah, ktorého hlavným účelom je vyriešiť konflikty mien. Obor názvov obsahuje základné deklarácie a / alebo definície entít.

Globálny menný priestor a jeho problém

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

#include
pomocou namespace std;
int ident = 55;
float ident = 12.17;
int main ()

návrat 0;

Vo vyššie uvedenom programe existujú dve premenné, ktoré sa obidve nazývajú ident. Tieto premenné sú v globálnom rozsahu; to znamená, že sú v globálnom mennom priestore. Pokus o kompiláciu tohto programu zlyhá s chybovou správou. Globálny rozsah neprijíma viac ako jednu premennú s rovnakým názvom, takže je potrebný vlastný menný priestor.

Vlastný menný priestor

Obor názvov nemá iba jedno meno. Namiesto toho má menný priestor množinu mien, aby sa zabránilo konfliktu s inými množinami mien. Aby ste sa vyhli konfliktom nižšie v kóde, pred každým menom zadajte názov priestoru názvov a :: . Nasledujúci program to ilustruje pomocou dvoch vlastných menných priestorov:

#include
pomocou namespace std;
menný priestor NA

int varInt = 6;
float flt;

menný priestor NB

int varInt = 7;
float flt;

int main ()

cout << NA::varInt << '\n';
cout << NB::varInt << '\n';
NA :: flt = 2.5;
Pozn .: flt = 4.8;
cout << NA::flt << '\n';
cout << NB::flt << '\n';
návrat 0;

Výstup je:

6
7
2.5
4.8

Všimnite si, že mená NA :: flt a Pozn .: flt boli nakoniec definované v hlavný() funkcia. C ++ neumožňuje takúto definíciu v globálnom rozsahu.

Upozorňujeme, že vlastný menný priestor je vnoreným menným priestorom pre globálny menný priestor.

Smernica o používaní

Ak chcete po vyhlásení priestoru názvov vyhnúť sa neustále písaniu výrazu „namepace :: name“, nielen výrazu „name“, môžete použiť použitím smernice. Syntax, ktorá sa má použiť použitím smernica je nasledovná:

pomocou menného priestoru Namespace_name;

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

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

#include
pomocou namespace std;
menný priestor NB

int varInt = 7;
int func ()

návratový varInt;


int fn ()

pomocou menného priestoru NB;
int myVar2 = func ();
// nasledujú ďalšie objekty a funkcie od NB.
vrátiť myVar2;

int myVar3 = NB :: func ();
int main ()

cout << fn() << " << myVar3 << '\n';
návrat 0;

Výstupom tohto programu je 7 7. Termín "pomocou menného priestoru NB;”Bol umiestnený na začiatku fn () definícia. The func () z priestoru názvov NB sa volá tesne pod tým, bez predchádzania znakom „Pozn .:.“

Premenná deklarovaná v globálnom rozsahu (globálny menný priestor) je viditeľná od deklaračného bodu po koniec súboru. Je to vidieť aj na vnorených menných priestoroch (vnorené rozsahy), ako sú napríklad vnorené fn () rozsah funkcií vyššie. The použitím direktíva spája svoj menný priestor z polohy, v ktorej je umiestnená, na koniec rozsahu, v ktorom je umiestnená.

Názov func () z menného priestoru NB nie je možné vidieť pod fn () definícia, pretože „pomocou menného priestoru NB; “ bol umiestnený do rozsahu funkcie (blok). Za týchto podmienok použitefunc ()„Mimo blok (rozsah) menného priestoru NB musí predchádzať“Pozn .:,“Ako v nasledujúcom vyhlásení:

int myVar3 = NB :: func ();

The použitím direktíva spája svoj menný priestor s vonkajším vnoreným menným priestorom z pozície, v ktorej je umiestnená na koniec vonkajšieho vnoreného menného priestoru. V nasledujúcom programe je menný priestor NA spojený s globálnym menným priestorom. Oba menné priestory potom zasahujú do fn () menný priestor definície funkcií, v ktorom sú spojené s menným priestorom NB. Menný priestor NB končí na konci fn () definícia funkcie a dva predchádzajúce menné priestory pokračujú až do konca súboru (čítať cez kód).

#include
pomocou namespace std;
menný priestor NA

int varInt = 6;
int func ()

návratový varInt;


menný priestor NB

int varInt = 7;
int func ()

návratový varInt;


pomocou menného priestoru NA;
int myVar0 = varInt;
// nasledujú ďalšie objekty a funkcie od :: a NB.
int fn ()

int myVar1 = varInt;
pomocou menného priestoru NB;
int myVar2 = NB :: func ();
// nasledujú ďalšie objekty a funkcie od NB až do konca tohto rozsahu.
vrátiť myVar1 + myVar2;

// Nasledujú iba objekty a funkcie z :: a NB.
int myVar3 = NB :: func ();
int main ()

cout << myVar0 << " << fn() << " << myVar3 << '\n';
návrat 0;

Výstup je 6, 13, 7.

Poznámka: Globálny menný priestor je označený :: , čo znamená, že pred operátorom riešenia rozsahu nie je nič, čo by nasledovalo.

Pod prehlásením „pomocou menného priestoru NA;”Premenné z globálnych a NA menných priestorov môžu byť použité bez uvedenia ich zdrojového menného priestoru. Nasledujúci príkaz používa znak varInt menného priestoru NA. Globálny a NA kombinovaný región menného priestoru zasahuje do oblasti fn () menný priestor funkcií. Takže varInt prvého vyjadrenia v fn () funkčný rozsah, je menného priestoru NA.

Pretože región pre globálne a NA menné priestory sa rozprestiera po celom svete fn () rozsah, po „int myVar2 = NB :: func ();,„Ľubovoľný názov z menného priestoru NB je možné použiť iba v doméne fn () rozsah bez predchádzajúceho znaku „Pozn .:,”Iba ak sa nevyskytovala v NA a globálnych menných priestoroch (blokoch). V opačnom prípade by malo predchádzať „Pozn .:.„Oblasť kombinovaných menných priestorov pre NA a globálne pokračuje pod fn () a do definície hlavný() funkcie až do konca súboru.

Rozšírenie menného priestoru NB začína od „int myVar2 = NB :: func ();“V fn () blok a končí na konci fn () definičný blok.

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

Oblasti menného priestoru

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

O entitách deklarovaných v tele menného priestoru sa hovorí, že sú členmi menného priestoru, a názvy zavedené týmito deklaráciami do deklaratívnej oblasti menného priestoru sú považované za názvy členov menného priestoru.

Vnorené menné priestory

Nasledujúci program zobrazuje vnorené menné priestory:

#include
pomocou namespace std;
menný priestor A

int i = 1;
menný priestor B

int i = 2;
menný priestor C

int i = 3;



int main ()

cout << A::i << " << A::B::i << " << A::B::C::i << '\n';
návrat 0;

Výstup je:

1 2 3

Všimnite si, že k trom hodnotám sa pristupovalo pomocou operátora rozlíšenia rozsahu.

Štandardný menný priestor

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 menného priestoru nazývaného štandardný menný priestor, napísaného ako std. Štandardná knižnica obsahuje pod knižnice a jednou z týchto pod knižníc je prúd. The prúd knižnica obsahuje objekt cout, ktorý sa používa na zasielanie výsledkov do konzoly (terminálu).

Názov cout musí byť v std menný priestor. Použit prúd s tým std menný priestor, program by mal byť nasledovný:

#include
pomocou namespace std;

Všimnite si použitie použitím smernice a std. Termín "#include ”Je smernica pred prepracovaním a nekončí sa bodkočiarkou. Zahŕňa „súbor“ iostream na mieste svojej smernice.

Záver

Menný priestor je rozsah. Popis (definícia) menného priestoru obsahuje základné deklarácie a / alebo definície objektov, funkcií a iných entít v C ++. Mimo definície menného priestoru je k názvu možné pristupovať pomocou syntaxe, “namespaceName :: name.„Okrem globálneho menného priestoru (globálny rozsah) by mal byť akýkoľvek menný priestor deklarovaný v bloku. Tento blok je prvou časťou prípadne distribuovaných oblastí menného priestoru. Vďaka použitím direktívu, priestor mien môže byť rozšírený ako región v iných oboroch. Menné priestory, ktorých oblasti sú spojené, by nemali mať v rôznych blokoch menného priestoru rovnaký názov premennej, pretože by to stále spôsobilo konflikt názvov.

Chrys

Hry OpenTTD vs Simutrans
OpenTTD vs Simutrans
Vytvorenie vlastnej simulácie dopravy môže byť zábavné, relaxačné a mimoriadne lákavé. Preto sa musíte uistiť, že vyskúšate čo najviac hier, aby ste n...
Hry Výukový program OpenTTD
Výukový program OpenTTD
OpenTTD je jednou z najpopulárnejších obchodných simulačných hier. V tejto hre musíte vytvoriť úžasné dopravné podnikanie. Začnete však na začiatku ok...
Hry SuperTuxKart pre Linux
SuperTuxKart pre Linux
SuperTuxKart je vynikajúci titul navrhnutý tak, aby vám priniesol zážitok z hry Mario Kart zadarmo na vašom systéme Linux. Je to dosť náročné a zábavn...