C ++

C ++ névtér

C ++ névtér
A C ++ névtér egy általánosított hatókör. A deklaráció a fenntartott szóval, a névtérrel kezdődik, amelyet egy programozó által választott név követ, majd a zárójelben lévő blokk. A blokk tartalmazza a C ++ objektumok, függvények és más entitások alapvető deklarációit és / vagy definícióit.

Vegye figyelembe a következő két skaláris állítást globális körben, a következő programban:

#include
névtér használata std;
int varId = 5;
floT varId = 2.3;
int main ()

visszatér 0;

A program fordítási kísérlete fordítási hibához vezet. Két azonos nevű változó létezik, varId. Bár két különböző változó, két különböző típus, int és úszó, a fordító elutasítja a két deklarációt, mert ugyanazon a néven vannak. A következő program megoldja ezt a problémát az azonos nevű változók két különböző általánosított körben történő deklarálásával:

#include
névtér használata std;
névtér NA

int varId = 5;

névtér NB

float varId = 2.3;

int main ()

cout << NA::varId << '\n';
cout << NB::varId << '\n';
visszatér 0;

A kimenet a következő:

5
2.3

Két névtér van a fenti programban: NA, amelynek meghatározása egész szám, és NB, amely megadja az úszó definícióját, de ugyanazzal a névvel rendelkezik, mint az NA egész száma. Végül a program futtatásakor két különböző változó azonos nevét használták. Vegye figyelembe, hogy két különböző változó azonos nevéhez való hozzáféréshez a névtér adott nevét kell használni, amelyet a közös azonosító követ. A névtér nevét és a közös azonosítót a hatókörfeloldás operátor választja el,::.”A névterek neve megkülönbözteti az objektumokat.

Ez a cikk a névtér alapkoncepciójával és annak használatával foglalkozik a C ++ programozási nyelven. A cikk követéséhez alapvető ismeretekkel kell rendelkeznie a C ++ nyelvről. Tudnia kell a C ++ hatóköréről is, bár ezt a cikk röviden ismerteti. Ha többet szeretne megtudni a C ++ hatóköréről, keresse meg a „Scope in C ++” kifejezést (idézőjelek nélkül) bármely linuxhint keresőmezőjében.com weboldal és nyomja meg az Enter billentyűt. Ez eljut a cikk írásához, amelyet a szerző írt.

A cikk tartalma

Mi a névtér?

A deklaratív régió a program legnagyobb része, amelyben egy entitás (változó) neve érvényes. Ezt a régiót hatókörnek nevezzük. A C ++ névtér egy általánosított hatókör, amelynek fő célja a névütközések megoldása. A névtér alapvető deklarációkkal és / vagy entitások definíciókkal rendelkezik.

Globális névtér és problémája

A globális névtér a globális hatókör. Fontolja meg a következő rövid programot:

#include
névtér használata std;
int azonos = 55;
úszó azonosító = 12.17;
int main ()

visszatér 0;

A fenti programban két változó létezik, mindkettőt hívják azonosító. Ezek a változók globális hatókörben vannak; vagyis a globális névtérben vannak. A program fordítási kísérlete hibaüzenettel nem sikerül. A globális hatókör nem fogad el egynél több azonos nevű változót, ezért szükség van egy egyedi névtérre.

Egyéni névtér

A névtérnek nem csak egy neve van. Ehelyett egy névtérnek van egy névkészlete, hogy elkerülje az ütközést más névsorokkal. A kód alacsonyabb ütközésének elkerülése érdekében minden név elé írja be a névtér nevét és :: . A következő program ezt két egyedi névtér használatával szemlélteti:

#include
névtér használata std;
névtér NA

int varInt = 6;
úszó flt;

névtér NB

int varInt = 7;
úszó flt;

int main ()

cout << NA::varInt << '\n';
cout << NB::varInt << '\n';
NA :: flt = 2.5;
NB :: flt = 4.8;
cout << NA::flt << '\n';
cout << NB::flt << '\n';
visszatér 0;

A kimenet:

6
7
2.5
4.8

Vegye figyelembe, hogy a nevek NA :: flt és NB :: flt végső soron a fő() funkció. A C ++ nem engedélyezi az ilyen meghatározást globális hatókörben.

Vegye figyelembe, hogy az egyéni névtér a globális névtér beágyazott névtere.

A használó irányelv

Annak elkerülése érdekében, hogy a névtér deklarálása után csak a „név” helyett írja be a „namepace :: name” szót, használhatja a felhasználásával irányelv. A szintaxis a felhasználásával irányelv a következő:

névtér használata Névtér_név;

A felhasználásával direktíva nem előfeldolgozó irányelv, ezért pontosvesszővel (;) végződik.

A következő program szemlélteti a felhasználásával irányelv és még sok más:

#include
névtér használata std;
névtér NB

int varInt = 7;
int func ()

return varInt;


int fn ()

névtér használata NB;
int myVar2 = func ();
// az NB egyéb objektumai és funkciói következnek.
return myVar2;

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

cout << fn() << " << myVar3 << '\n';
visszatér 0;

Ennek a programnak a kimenete az 7 7. A „névtér használata NB;”Elejére került fn () meghatározás. A func () az NB névtérből éppen ezt hívják, anélkül, hogy „NB ::.”

A globális hatókörben deklarált változó (globális névtér) a deklaráció pontjától a fájl végéig látható. A beágyazott névterekben (beágyazott hatókörökben) is látható, például a beágyazottaknál fn () függvény hatóköre fent. A felhasználásával Az irányelv abból a pozícióból csatlakozik névteréhez, amelybe kerül, és annak a körnek a végéig, amelybe tartozik.

A név func () az NB névtérből nem látható a fn () definíció, mertnévtér használata NB; ” a függvény hatókörébe került (blokk). Ebben az esetben a „func ()”Az NB névtér-blokkon (hatókörön kívül) megelőzve a„NB ::,”, Mint a következő nyilatkozatban:

int myVar3 = NB :: func ();

A felhasználásával A direktíva a külső fészkelő névtérrel összekapcsolja a névterét attól a helytől, ahol elhelyezi, a külső fészkelő névtér végéig. A következő programban az NA névtér össze van kapcsolva a globális névtérrel. Ezután mindkét névtér kiterjed a fn () függvénydefiníciós névtér, amelyben össze vannak kapcsolva az NB névtérrel. Az NB névtér a fn () a funkció meghatározása, és a két előző névtér a fájl végéig folytatódik (a kód végigolvasása).

#include
névtér használata std;
névtér NA

int varInt = 6;
int func ()

return varInt;


névtér NB

int varInt = 7;
int func ()

return varInt;


névtér használata NA;
int myVar0 = varInt;
// a :: és az NB egyéb objektumai és funkciói következnek.
int fn ()

int myVar1 = varInt;
névtér használata NB;
int myVar2 = NB :: func ();
// az NB-től származó egyéb objektumok és funkciók következnek ennek a hatókörnek a végéig.
adja vissza myVar1 + myVar2;

// Csak a :: és az NB objektumai és funkciói következnek.
int myVar3 = NB :: func ();
int main ()

cout << myVar0 << " << fn() << " << myVar3 << '\n';
visszatér 0;

A kimenet az 6, 13, 7.

Jegyzet: A globális névteret a :: , ami azt jelenti, hogy a hatókörfeloldás operátor előtt nincs semmi, ami következik.

A nyilatkozat alatt a „névtér használata NA;”A globális és az NA névtér változói felhasználhatók a forrás névtér megjelölése nélkül. A következő állítás a varInt az NA névtér. A globális és az NA együttes névtér-régió kiterjed a fn () függvény névtér. Így a varInt első állításának fn () függvény hatóköre, az NA névtér.

Mivel a globális és az NA névtér régiója az egész fn () hatálya után a „int myVar2 = NB :: func ();,”Az NB névtérből származó bármely név csak a fn () hatályát anélkül, hogy aNB ::,”Csak akkor, ha nem az NA-ban és a globális névtérben (blokkok) fordult elő. Ellenkező esetben a „NB ::.Az NA és a globális névtér együttes régiója a fn () definícióba és az fő() funkció a fájl végéig.

Az NB névtér kiterjesztése "int myVar2 = NB :: func ();" ban,-ben fn () blokk és a végén a fn () definíció blokk.

Jegyzet: Azok a névterek, amelyeknek a régiói össze vannak kapcsolva, nem rendelkezhetnek ugyanazzal a változóval a különböző névtér-blokkokban, mert ez továbbra is konfliktust okoz.

Névtér régiók

A névtér egy hatókör. A globális névtéren (globális hatókör) kívül minden névteret blokkban kell deklarálni. Ez a blokk a névtér esetlegesen elosztott régióinak első része. A using direktívával a névtér régióként bővíthető más hatókörökben.

A névtér törzsében deklarált entitásokról azt mondják, hogy tagjai a névtérnek, és az ezen deklarációk által a névtér deklaratív régiójába bevezetett nevek a névtér tagneveinek.

Beágyazott névterek

A következő program beágyazott névtereket mutat:

#include
névtér használata std;
névtér A

int i = 1;
névtér B

int i = 2;
névtér C

int i = 3;



int main ()

cout << A::i << " << A::B::i << " << A::B::C::i << '\n';
visszatér 0;

A kimenet:

1 2 3

Figyelje meg, hogy a három érték elérése a hatókör-felbontás operátorral történt.

Normál névtér

A C ++ rendelkezik egy standard könyvtár nevű könyvtárral. A könyvtárban található objektumok, függvények és egyéb entitások neve egy névtérből nevezett névtérből származik std. A standard könyvtár tartalmaz alkönyvtárakat, és ezek egyike iostream. A iostream könyvtár tartalmazza az objektumot cout, amelyet az eredmények elküldésére használnak a konzolra (terminálra).

A név cout kell lennie a std névtér. Használni iostream azzal std névtér, a programnak a következőnek kell lennie:

#include
névtér használata std;

Vegye figyelembe a felhasználásával irányelv és std. A „#include ”Egy előfeldolgozó irányelv, és nem záródik pontosvesszővel. Az iostream „fájlt” tartalmazza az irányelv helyén.

Következtetés

A névtér egy hatókör. A névtér leírása (definíció) a C ++ objektumok, függvények és más entitások alapvető deklarációit és / vagy definícióit tartalmazza. A névtér meghatározásán kívül a név a szintaxissal érhető el:namespaceName :: név.”A globális névtéren (globális hatókör) kívül minden névteret blokkban kell deklarálni. Ez a blokk a névtér esetlegesen elosztott régióinak első része. A ... val felhasználásával irányelvben a névtér kiterjeszthető régióként más hatókörökben. Azok a névterek, amelyeknek a régiói össze vannak kapcsolva, nem rendelkezhetnek ugyanazzal a változóval a különböző névtér-blokkokban, mert ez még mindig névütközést okozna.

Chrys

A top 5 ergonómikus számítógépes egértermék Linuxhoz
Hosszan tartó számítógép-használat okoz-e fájdalmat a csuklóján vagy az ujjain?? Merev ízületek szenvednek, és folyamatosan kezet kell rázniuk? Égő fá...
Az egér és az érintőpad beállításainak módosítása az Xinput használatával Linux alatt
A legtöbb Linux disztribúció alapértelmezés szerint „libinput” könyvtárral szállítja a rendszer bemeneti eseményeit. Feldolgozhatja a Wayland és az X ...
Az X-Mouse Button Control segítségével az egér gombjait másképp alakíthatja át a különböző szoftvereknél
Lehet, hogy szüksége van egy eszközre, amely megváltoztathatja az egér vezérlését minden használt alkalmazással. Ebben az esetben kipróbálhatja az úgy...