Obor názvů C ++

C Namespace



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

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







#zahrnout
pomocí oboru názvů std;

intvarId= 5;
plovákvarId= 2.3;

inthlavní()
{

vrátit se 0;
}

Pokus o kompilaci tohoto programu vede k chybě kompilace. Existují dvě proměnné se stejným názvem, varId . Ačkoli se jedná o dvě různé proměnné dvou různých typů, int a plovák kompilátor 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 generalizovaných oborech:



#zahrnout
pomocí oboru názvů std;

obor názvů NA
{
intvarId= 5;
}

jmenný prostor Pozn
{
plovákvarId= 2.3;
}

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

vrátit se 0;
}

Výstup je následující:



5
2.3

Ve výše uvedeném programu jsou dva obory názvů: NA , který má definici celého čísla, a Pozn , který má definici float, 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 toho, ž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 pro obor názvů, následovaný společným identifikátorem. Název oboru názvů a společný identifikátor jsou odděleny operátorem rozlišení oboru, :: . Název oborů názvů bude odlišovat objekty.





Tento článek se zabývá základním konceptem oboru názvů a jeho využitím v programovacím jazyce C ++. Chcete -li se řídit tímto článkem, měli byste mít základní znalosti jazyka C ++. Měli byste také znát rozsah 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 frázi Scope v C ++ (bez uvozovek) ve vyhledávacím poli jakékoli webové stránky linuxhint.com a stiskněte 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ém je platný název entity (proměnné). Tato oblast se nazývá obor. Obor názvů v C ++ je zobecněný rozsah, jehož hlavním účelem je vyřešit konflikty názvů. Obor názvů má základní deklarace a/nebo definice entit.



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

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

#zahrnout
pomocí oboru názvů std;

intident= 55;
plovákident= 12.17;

inthlavní()
{

vrátit se 0;
}

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

Vlastní jmenný prostor

Obor názvů nemá pouze jedno jméno. Místo toho má obor názvů sadu jmen, aby se předešlo konfliktu s jinými sadami jmen. Abyste se vyhnuli konfliktu v kódu níže, vložte před každý název název oboru názvů a :: . Následující program to ilustruje pomocí dvou vlastních oborů názvů:

#zahrnout
pomocí oboru názvů std;

jmenný prostor NA
{
intVARIANT= 6;
plovákflt;
}

jmenný prostor Pozn
{
intVARIANT= 7;
plová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átit se 0;
}

Výstupem je:

6
7
2.5
4.8

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

Všimněte si, že vlastní obor názvů je vnořený obor názvů pro globální obor názvů.

Směrnice o používání

Chcete -li se vyhnout tomu, že byste po deklaraci oboru názvů neustále psali namepace :: name namísto just name, můžete použít použitím směrnice. Syntaxe pro použití použitím směrnice je následující:

pomocí oboru názvů Namespace_name;

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

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

#zahrnout
pomocí oboru názvů std;

jmenný prostor Pozn
{
intVARIANT= 7;
intfunkce()
{
vrátit seVARIANT;
}
}

intfn()
{
pomocí oboru názvů Pozn;
intmyVar2=funkce();
// následují další objekty a funkce z NB.
vrátit semyVar2;
}

intmyVar3=Pozn::funkce();

inthlavní()
{
náklady<<fn() << '' <<myVar3<< ' n';

vrátit se 0;
}

Výstupem tohoto programu je 7 7 . Termín pomocí oboru názvů NB; byl umístěn na začátku fn () definice. The func () z oboru názvů NB se nazývá těsně pod tím, bez předchozího s Pozn .: .

Proměnná deklarovaná v globálním oboru (globální obor názvů) je viditelná od bodu deklarace do konce souboru. Je také vidět ve vnořených oborech názvů (vnořené obory), jako jsou například vnořené fn () rozsah funkcí výše. The použitím direktiva spojuje svůj obor názvů z ​​pozice, na které je umístěna, na konec oboru, ve kterém je umístěna.

Název func () z oboru názvů NB není vidět pod fn () definice, protože pomocí oboru názvů NB; byl umístěn do funkčního rozsahu (bloku). Za této podmínky použít func () mimo blok (obor) oboru názvů NB, musí mu předcházet Pozn .: , jako v následujícím prohlášení:

intmyVar3=Pozn::funkce();

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

#zahrnout
pomocí oboru názvů std;

jmenný prostor NA
{
intVARIANT= 6;
intfunkce()
{
vrátit seVARIANT;
}

}

jmenný prostor Pozn
{
intVARIANT= 7;
intfunkce()
{
vrátit seVARIANT;
}
}

pomocí oboru názvů NA;
intmyVar0=VARIANT;
// následují další objekty a funkce z :: a NB.

intfn()
{
intmyVar1=VARIANT;
pomocí oboru názvů Pozn;
intmyVar2=Pozn::funkce();
// další objekty a funkce z NB následují až do konce tohoto rozsahu.
vrátit semyVar1+myVar2;
}

// Následují pouze objekty a funkce z :: a NB.

intmyVar3=Pozn::funkce();

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

vrátit se 0;
}

Výstup je 6, 13, 7 .

Poznámka: Globální obor názvů je označen pomocí :: , což znamená, že před operátorem řešení rozsahu není nic, co následuje.

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

Vzhledem k tomu, že oblast pro globální a NA jmenné prostory se rozprostírá po celém fn () rozsah, po int myVar2 = NB :: func (); , jakýkoli název z oboru názvů NB lze použít pouze v fn () rozsah bez předchozího s Pozn .: , pouze pokud k tomu nedošlo v NA a globálních oborech názvů (blocích). Jinak by tomu mělo předcházet Pozn .: . Oblast kombinovaných oborů názvů pro NA a globální pokračuje pod fn () definice a do hlavní() fungovat až do konce souboru.

Rozšíření oboru názvů NB začíná od int myVar2 = NB :: func (); v fn () blok a končí na konci fn () definiční blok.

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

Oblasti oboru názvů

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

O entitách deklarovaných v těle oboru názvů se říká, že jsou členy oboru názvů, a názvy zavedené těmito deklaracemi do deklarativní oblasti oboru názvů se nazývají názvy členů oboru názvů.

Vnořené obory jmen

Následující program ukazuje vnořené obory názvů:

#zahrnout
pomocí oboru názvů std;

jmenný prostor A.
{
int= 1;
jmenný prostor B
{
int= 2;
jmenný prostor C
{
int= 3;
}
}
}

inthlavní()
{
náklady<<NA:: << '' <<NA::B:: << '' <<NA::B::C:: << ' n';

vrátit se 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í obor názvů

C ++ má knihovnu nazývanou 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ý jako hodiny . Standardní knihovna obsahuje dílčí knihovny a jedna z těchto dílčích knihoven je iostream . The iostream knihovna obsahuje objekt náklady , který slouží k odesílání výsledků do konzoly (terminálu).

Název náklady musí být v hodiny jmenný prostor. Použít iostream s jeho hodiny obor názvů, program by měl být následující:

#zahrnout
pomocí oboru názvů std;

Všimněte si použití použitím směrnice a hodiny . Termín #zahrnout je direktiva preprocesoru a nekončí středníkem. Obsahuje 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 oboru názvů (globální rozsah) by měl být jakýkoli obor názvů deklarován v bloku. Tento blok je první částí případně distribuovaných oblastí oboru názvů. S použitím směrnice, lze obor názvů rozšířit jako oblasti v jiných oborech. Obor názvů, jejichž regiony jsou spojeny, by v různých blocích oboru názvů neměl mít stejný název proměnné, protože by to stále způsobilo konflikt názvů.

Chrys