C ++ névtér

C Namespace



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

Tekintsük a következő két skaláris állítást globális hatókörben, a következő programban:







#befoglalni
névtér standard használatával;

intvarId= 5;
úszóvarId= 2.3;

intfő-()
{

Visszatérés 0;
}

A program fordítására tett kísérlet fordítási hibához vezet. Két azonos nevű változó van, varId . Bár két különböző típusú változóról van szó, int és úszó , a fordító elutasítja a két deklarációt, mert azonos nevűek. A következő program úgy oldja meg ezt a problémát, hogy az azonos nevű változókat két különböző általános tartományban deklarálja:



#befoglalni
névtér standard használatával;

névtér NA
{
intvarId= 5;
}

névtér NB
{
úszóvarId= 2.3;
}

intfő-()
{
költség<<NA::varId << ' n';
költség<<NB::varId << ' n';

Visszatérés 0;
}

A kimenet a következő:



5
2.3

A fenti programban két névtér található: NA , amelynek definíciója egész, és NB , amely úszó definícióval rendelkezik, de ugyanazzal a névvel, mint az NA egész száma. Végül a program futtatásakor ugyanazt a nevet használták két különböző változóhoz. Vegye figyelembe, hogy két különböző változó azonos nevének eléréséhez a névtér adott nevét kell használni, majd a közös azonosítót. A névtér nevét és a közös azonosítót a hatókörfeloldó operátor választja el, :: . A névterek neve megkülönbözteti az objektumokat.





Ez a cikk a névtér alapfogalmát és a C ++ programozási nyelvben való használatát tárgyalja. A cikk követéséhez alapvető ismeretekkel kell rendelkeznie a C ++ nyelvről. Ismernie kell a C ++ hatókört is, bár ebben a cikkben röviden ismertetjük. Ha többet szeretne megtudni a C ++ hatókörről, keresse meg a Scope in C ++ kifejezést (idézőjelek nélkül) bármely linuxhint.com weboldal keresőmezőjében, és nyomja meg az Enter billentyűt. Ez elvezet az író által írt cikkhez.

Cikk tartalma

Mi az 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 nevezik. 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ókat és/vagy entitásdefiníciókat tartalmaz.



A globális névtér és problémája

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

#befoglalni
névtér standard használatával;

intazonosító= 55;
úszóazonosító= 12.17;

intfő-()
{

Visszatérés 0;
}

A fenti programban két változó van, mindkettő ún azonosító . Ezek a változók a globális hatókörbe tartoznak; vagyis a globális névtérben vannak. A program fordítási kísérlete hibaüzenetet eredményez. 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éni névtérre.

Egyéni névtér

Egy 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évkészletekkel. Az alacsonyabb kódütközések elkerülése érdekében minden név előtt írja be a névtér nevét és :: . A következő program ezt szemlélteti két egyéni névtér használatával:

#befoglalni
névtér standard használatával;

névtér NA
{
intváltozó= 6;
úszóflt;
}

névtér NB
{
intváltozó= 7;
úszóflt;
}

intfő-()
{
költség<<NA::változó << ' n';
költség<<NB::változó << ' n';
NA::flt = 2.5;
NB::flt = 4.8;
költség<<NA::flt << ' n';
költség<<NB::flt << ' n';

Visszatérés 0;
}

A kimenet:

6
7
2.5
4.8

Vegye figyelembe, hogy a nevek NA :: flt és NB :: flt végül definiálták a fő() funkció. A C ++ nem teszi lehetővé az ilyen meghatározást a globális hatókörben.

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

A használati irányelv

Annak elkerülése érdekében, hogy a névtér :: name nevét mindig a névtér deklarálása után írja be a név helyett, használja a segítségével irányelv. A szintaxis a segítségével irányelv a következő:

névtér használatával Namespace_name;

Az segítségével irányelv nem előfeldolgozó irányelv, ezért pontosvesszővel (;) végződik.

Az alábbi program a segítségével irányelv és egyebek:

#befoglalni
névtér standard használatával;

névtér NB
{
intváltozó= 7;
intfunkció()
{
Visszatérésváltozó;
}
}

intfn()
{
névtér használatával NB;
intmyVar2=funkció();
// az NB egyéb objektumai és funkciói következnek.
VisszatérésmyVar2;
}

intmyVar3=NB::funkció();

intfő-()
{
költség<<fn() << '' <<myVar3<< ' n';

Visszatérés 0;
}

Ennek a programnak a kimenete az 7 7 . A kifejezés névtér használata NB; elején helyezték el fn () meghatározás. Az func () az NB névtérből csak ez alatt hívják, anélkül, hogy előtte lenne Megjegyzés :: .

A globális hatókörben (globális névtér) deklarált változó a deklaráció helyétől a fájl végéig látható. Látható a beágyazott névterekben is (beágyazott hatókörök), például a beágyazott fn () fenti funkciókör. Az segítségével direktíva csatlakozik a névtérhez attól a helytől, ahol elhelyezték, és annak a körnek a végéig, amelyben elhelyezték.

A név func () az NB névtérből nem látható a fn () definíciója, mert névtér használata NB; függvény hatókörébe (blokk) került. Ilyen feltételek mellett használni func () az NB névtér blokkon (hatókörön) kívül, előtte kell szerepelnie Megjegyzés :: , mint az alábbi nyilatkozatban:

intmyVar3=NB::funkció();

Az segítségével direktíva összekapcsolja névterét a külső beágyazó névtérrel attól a helytől, ahol elhelyezi, és a külső fészkelő névtér végéig. A következő programban az NA névtér összekapcsolódik 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 végén ér véget fn () függvénydefiníció, és a két korábbi névtér a fájl végéig tart (olvassa el a kódot).

#befoglalni
névtér standard használatával;

névtér NA
{
intváltozó= 6;
intfunkció()
{
Visszatérésváltozó;
}

}

névtér NB
{
intváltozó= 7;
intfunkció()
{
Visszatérésváltozó;
}
}

névtér használatával NA;
intmyVar0=változó;
// egyéb objektumok és függvények a :: és NB -ből következnek.

intfn()
{
intmyVar1=változó;
névtér használatával NB;
intmyVar2=NB::funkció();
// egyéb objektumok és függvények az NB -ből, ennek a hatókörnek a végéig.
VisszatérésmyVar1+myVar2;
}

// Csak a :: és az NB objektumai és függvényei következnek.

intmyVar3=NB::funkció();

intfő-()
{
költség<<myVar0<< '' <<fn() << '' <<myVar3<< ' n';

Visszatérés 0;
}

A kimenet az 6, 13, 7 .

Jegyzet: A globális névteret jelzi :: , ami azt jelenti, hogy a következő hatókör -felbontási operátor előtt nincs semmi.

A nyilatkozat alatt a névtér használata NA; a globális és az NA névtér változói a forrás névtér megjelölése nélkül használhatók. A következő állítás a változó az NA névtérből. A globális és NA kombinált névtér régió a fn () függvény névtér. Így a változó első állításának a fn () függvény hatóköre, az NA névtérhez tartozik.

Mivel a globális és NA névterek régiója az egész fn () hatálya, miután int myVar2 = NB :: func (); , az NB névtér bármely neve csak a fn () hatálya anélkül, hogy előtte lenne Megjegyzés :: , csak akkor, ha nem fordult elő az NA és a globális névterekben (blokkokban). Ellenkező esetben előtte kell lennie Megjegyzés :: . Az NA és a globális kombinált névterek régiója a fn () definíció és a fő() funkciót a fájl végéig.

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

Jegyzet: Azok a névterek, amelyeknek régiói össze vannak kapcsolva, nem tartalmazhatnak azonos változónevet a különböző névtérblokkokban, mivel ez továbbra is ütközést okozna.

Névtérségi 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 esetleg elosztott régióinak első része. A használati irányelvvel a névtér régióként bővíthető más hatókörökben.

A névtér -törzsben deklarált entitásokról azt mondják, hogy a névtér tagjai, és az ezekkel a deklarációkkal a névtér deklaratív régiójába bevezetett nevek a névtér tagnevei.

Beágyazott névterek

A következő program beágyazott névtereket jelenít meg:

#befoglalni
névtér standard használatával;

névtér A
{
intén= 1;
névtér B
{
intén= 2;
névtér C
{
intén= 3;
}
}
}

intfő-()
{
költség<<NAK NEK::én << '' <<NAK NEK::B::én << '' <<NAK NEK::B::C::én << ' n';

Visszatérés 0;
}

A kimenet:

1 2 3

Figyelje meg, hogy a három érték a hatókör -felbontási operátor segítségével lett elérve.

Standard névtér

A C ++ rendelkezik szabványos könyvtárral. A könyvtárban található objektumok, függvények és más entitások nevei a szabványos névtér nevű névtérből származnak, és így íródnak órák . A standard könyvtár alkönyvtárakat tartalmaz, és az egyik ilyen alkönyvtár iostream . Az iostream könyvtár tartalmazza az objektumot költség , amelyet az eredmények konzolra (terminálra) küldésére használnak.

A név költség kell lennie a órák névtér. Használni iostream azzal órák névtérben a programnak a következőnek kell lennie:

#befoglalni
névtér standard használatával;

Vegye figyelembe a segítségével irányelv és órák . A kifejezés #befoglalni egy előfeldolgozó irányelv, és nem vesszővel végződik. Az irányelv helyén tartalmazza az iostream fájlt.

Következtetés

A névtér egy hatókör. A névtér leírása (definíciója) 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 definíció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 esetleg elosztott régióinak első része. A ... val segítségével direktíva szerint a névtér kiterjeszthető más hatókörű régióként. Azok a névterek, amelyeknek régiói össze vannak kapcsolva, nem tartalmazhatnak azonos változónevet a különböző névtérblokkokban, mivel ez továbbra is névütközést okozna.

Chrys