C ++

Obor názvů C ++

Obor názvů C ++
Obor názvů v C ++ je zobecněný obor. Jeho deklarace začíná vyhrazeným slovem, jmenným prostorem, následovaným názvem podle volby programátora a poté blokem ve složených závorkách. Blok obsahuje základní deklarace a / nebo definice C ++ objektů, funkcí a dalších entit.

Zvažte následující dva skalární příkazy v globálním rozsahu v následujícím programu:

#zahrnout
pomocí jmenného prostoru std;
int varId = 5;
float varId = 2.3;
int main ()

návrat 0;

Pokus o kompilaci tohoto programu vede k chybě kompilace. Existují dvě proměnné se stejným názvem, varId. I když se jedná o dvě různé proměnné dvou různých typů, int a plovák, překladač odmítne dvě deklarace, protože mají stejný název. Následující program řeší tento problém deklarováním proměnných se stejným názvem ve dvou různých zobecněných oborech:

#zahrnout
pomocí jmenného prostoru std;
jmenný prostor NA

int varId = 5;

jmenný prostor NB

float varId = 2.3;

int main ()

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

Výstup je následující:

5
2.3

Ve výše uvedeném programu jsou dva jmenné prostory: NA, který má definici celého čísla a Pozn, který má definici floatu, ale se stejným názvem jako celé číslo pro NA. Nakonec, když byl program spuštěn, byl použit stejný název pro dvě různé proměnné. Všimněte si, že pro přístup ke stejnému názvu dvou různých proměnných musí být použit konkrétní název oboru názvů, následovaný společným identifikátorem. Název oboru názvů a běžný identifikátor jsou odděleny operátorem rozlišení oboru, “::.„Název jmenných prostorů bude objekty odlišovat.

Tento článek popisuje základní koncept oboru názvů a jeho použití v programovacím jazyce C ++. Chcete-li sledovat tento článek, měli byste mít základní znalost jazyka C ++. Měli byste také mít znalosti o rozsahu C ++, i když je to stručně vysvětleno v tomto článku. Chcete-li se dozvědět více o rozsahu C ++, vyhledejte ve vyhledávacím poli libovolného linuxhintu frázi „Rozsah v C ++“ (bez uvozovek).com a stiskněte klávesu Enter. Tím se dostanete k článku, který tento autor napsal.

Obsah článku

Co je to jmenný prostor?

Deklarativní oblast je největší část programu, ve které je platný název entity (proměnné). Tato oblast se nazývá obor. Obor názvů v C ++ je zobecněný obor, jehož hlavním účelem je řešit konflikty názvů. Obor názvů obsahuje základní deklarace a / nebo definice entit.

Globální jmenný prostor a jeho problém

Globální obor jmen je globální obor. Zvažte následující krátký program:

#zahrnout
pomocí jmenného prostoru std;
int ident = 55;
float ident = 12.17;
int main ()

návrat 0;

Ve výše uvedeném programu existují dvě proměnné, obě se nazývají ident. Tyto proměnné jsou v globálním rozsahu; to znamená, že jsou v globálním oboru jmen. Pokus o kompilaci tohoto programu selže s chybovou zprávou. Globální obor nepřijímá více než jednu proměnnou se stejným názvem, takže je potřeba vlastní jmenný prostor.

Vlastní jmenný prostor

Obor názvů nemá pouze jedno jméno. Místo toho má obor názvů sadu názvů, aby nedocházelo ke konfliktu s jinými sadami názvů. Aby nedocházelo ke konfliktu níže v kódu, uveďte před každým názvem název oboru názvů a :: . Následující program to ilustruje pomocí dvou vlastních jmenných prostorů:

#zahrnout
pomocí jmenného prostoru std;
jmenný prostor NA

int varInt = 6;
float flt;

jmenný prostor 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ýstupem je:

6
7
2.5
4.8

Všimněte si, že jména NA :: flt a Pozn .: flt byly nakonec definovány v hlavní() funkce. C ++ neumožňuje takovou definici v globálním rozsahu.

Všimněte si, že vlastní jmenný prostor je vnořený jmenný prostor pro globální jmenný prostor.

Směrnice o používání

Chcete-li po deklaraci oboru názvů vyhnout se neustálému zadávání „namepace :: name“ namísto „name“, můžete použít použitím směrnice. Syntaxe pro použití použitím směrnice je následující:

pomocí jmenného prostoru Namespace_name;

The použitím směrnice není směrnice o preprocesoru, takže končí středníkem (;).

Následující program ilustruje použití použitím směrnice a další:

#zahrnout
pomocí jmenného prostoru std;
jmenný prostor NB

int varInt = 7;
int func ()

návratový varInt;


int fn ()

pomocí jmenného prostoru NB;
int myVar2 = func ();
// následují další objekty a funkce z NB.
vrátit myVar2;

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

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

Výstupem tohoto programu je 7 7. Termín "pomocí jmenného prostoru NB;“Bylo umístěno na začátku fn () definice. The func () z prostoru jmen NB se volá těsně pod tím, aniž by předcházelo „NB ::.“

Proměnná deklarovaná v globálním rozsahu (globální obor názvů) je vidět od bodu deklarace až po konec souboru. Je to také vidět ve vnořených oborech jmen (vnořených oborech), jako je vnořený fn () rozsah funkcí výše. The použitím direktiva se připojí ke svému oboru názvů z ​​pozice, na kterou je umístěna, na konec oboru, ve kterém je umístěna.

Název func () z prostoru jmen NB nelze vidět pod fn () definice, protože „pomocí jmenného prostoru NB; “ byl umístěn do rozsahu funkce (blok). Za této podmínky použít „func ()„Mimo blok jmenného prostoru NB (obor) musí předcházet„NB ::,„Jako v následujícím prohlášení:

int myVar3 = NB :: func ();

The použitím směrnice spojuje svůj jmenný prostor s vnějším vnořovacím jmenným prostorem z pozice, ve které je umístěna, na konec vnějšího vnořeného jmenného prostoru. V následujícím programu je jmenný prostor NA spojen s globálním jmenným prostorem. Oba jmenné prostory pak zasahují do fn () jmenný prostor definice funkce, ve kterém jsou spojeny s jmenným prostorem NB. Obor názvů NB končí na konci fn () definice funkce a dva předchozí jmenné prostory pokračují až do konce souboru (přečtěte si kód).

#zahrnout
pomocí jmenného prostoru std;
jmenný prostor NA

int varInt = 6;
int func ()

návratový varInt;


jmenný prostor NB

int varInt = 7;
int func ()

návratový varInt;


pomocí oboru názvů NA;
int myVar0 = varInt;
// následují další objekty a funkce z :: a NB.
int fn ()

int myVar1 = varInt;
pomocí jmenného prostoru NB;
int myVar2 = NB :: func ();
// následují další objekty a funkce od NB až do konce tohoto rozsahu.
vrátit myVar1 + myVar2;

// Následují pouze objekty a funkce 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ální jmenný prostor je označen :: , což znamená, že před operátorem rozlišení oboru, který následuje, není nic.

Pod prohlášením „pomocí oboru názvů NA;”Proměnné z globálních a NA jmenných prostorů lze použít bez uvedení jejich zdrojového jmenného prostoru. Následující příkaz používá varInt NA jmenného prostoru. Globální a NA kombinovaná oblast jmenného prostoru zasahuje do fn () jmenný prostor funkce. Takže varInt prvního prohlášení v fn () rozsah funkcí, je jmenného prostoru NA.

Vzhledem k tomu, že oblast globálních a NA jmenných prostorů se rozprostírá po celém světě fn () rozsah, po „int myVar2 = NB :: func ();,„Jakýkoli název z jmenného prostoru NB lze použít pouze v fn () rozsah bez předchozího s „NB ::,„Pouze pokud se nevyskytuje v NA a globálních jmenných prostorech (blocích). Jinak by tomu mělo předcházet „NB ::.„Oblast kombinovaných jmenných prostorů pro NA a globální pokračuje pod fn () definice a do hlavní() funkce až do konce souboru.

Rozšíření jmenného prostoru NB začíná „int myVar2 = NB :: func ();“V fn () blok a končí na konci fn () definiční blok.

Poznámka: Obory názvů, jejichž oblasti jsou spojeny, by neměly mít stejný název proměnné v jejich různých blocích oboru názvů, protože by to stále způsobilo konflikt.

Oblasti oboru názvů

Obor názvů je obor. Kromě globálního jmenného prostoru (globální obor) by měl být jakýkoli jmenný prostor deklarován v bloku. Tento blok je první částí potenciálně distribuovaných oblastí oboru názvů. Pomocí direktivy using lze obor názvů rozšířit jako oblasti v jiných oborech.

Entity deklarované v těle oboru názvů se považují za členy oboru názvů a názvy zavedené těmito deklaracemi do deklarativní oblasti oboru názvů se považují za názvy členů oboru názvů.

Vnořené obory jmen

Následující program zobrazuje vnořené jmenné prostory:

#zahrnout
pomocí jmenného prostoru std;
jmenný prostor A

int i = 1;
jmenný prostor B

int i = 2;
jmenný prostor C

int i = 3;



int main ()

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

Výstupem je:

1 2 3

Všimněte si, že ke třem hodnotám bylo přistupováno pomocí operátoru rozlišení oboru.

Standardní jmenný prostor

C ++ má knihovnu nazvanou standardní knihovna. Názvy objektů, funkcí a dalších entit v této knihovně pocházejí z oboru názvů nazývaného standardní obor názvů, zapsaného jako std. Standardní knihovna obsahuje dílčí knihovny a jedna z těchto dílčích knihoven je proud. The proud knihovna obsahuje objekt cout, který se používá k odesílání výsledků do konzoly (terminálu).

Název cout musí být v std jmenný prostor. Použít proud s jeho std jmenný prostor, program by měl být následující:

#zahrnout
pomocí jmenného prostoru std;

Všimněte si použití použitím směrnice a std. Termín "#zahrnout „Je směrnice o preprocesoru a nekončí středníkem. Zahrnuje „soubor“ iostream na pozici jeho směrnice.

Závěr

Obor názvů je obor. Popis (definice) oboru názvů obsahuje základní deklarace a / nebo definice objektů, funkcí a dalších entit C ++. Mimo definici oboru názvů lze k názvu přistupovat pomocí syntaxe, “namespaceName :: name.„Kromě globálního jmenného prostoru (globálního rozsahu) by měl být jakýkoli jmenný prostor deklarován v bloku. Tento blok je první částí potenciálně distribuovaných oblastí oboru názvů. S použitím směrnice, lze obor názvů rozšířit jako oblasti v jiných oborech. Obory názvů, jejichž regiony jsou spojeny, by neměly mít stejný název proměnné v jejich různých blocích oboru názvů, protože by to stále způsobilo konflikt názvů.

Chrys

Jak změnit velikost, barvu a schéma kurzoru myši a kurzoru v systému Windows 10
Ukazatel myši a kurzor ve Windows 10 jsou velmi důležité aspekty operačního systému. To lze říci i pro jiné operační systémy, takže ve skutečnosti nej...
Hry Zdarma a open source herní motory pro vývoj linuxových her
Zdarma a open source herní motory pro vývoj linuxových her
Tento článek pokryje seznam bezplatných a otevřených herních enginů, které lze použít pro vývoj 2D a 3D her v systému Linux. Existuje mnoho takových h...
Hry Výukový program Shadow of the Tomb Raider pro Linux
Výukový program Shadow of the Tomb Raider pro Linux
Shadow of the Tomb Raider je dvanáctý přírůstek do série Tomb Raider - série akčních adventur vytvořená Eidosem Montrealem. Tato hra byla docela dobře...