Imenski prostor C ++

C Namespace



Imeniški prostor v C ++ je posplošeno področje uporabe. Njegova izjava se začne z rezervirano besedo, imenskim prostorom, ki mu sledi ime po izbiri programerja, nato pa blok v oklepaju. Blok vsebuje osnovne deklaracije in/ali definicije objektov, funkcij in drugih entitet C ++.

Razmislite o naslednjih dveh skalarnih stavkih v globalnem obsegu v naslednjem programu:







#vključi
z uporabo imenskega prostora std;

intvarId= 5;
plavativarId= 2.3;

intglavni()
{

vrnitev 0;
}

Poskus sestavljanja tega programa povzroči napako pri sestavljanju. Obstajata dve spremenljivki z istim imenom, varId . Čeprav gre za dve različni spremenljivki dveh različnih vrst, int in plavati , prevajalnik zavrne obe deklaraciji, ker sta istoimenski. Naslednji program reši to težavo z razglasitvijo spremenljivk z istim imenom v dveh različnih posplošenih področjih:



#vključi
z uporabo imenskega prostora std;

imenski prostor NA
{
intvarId= 5;
}

imenski prostor NB
{
plavativarId= 2.3;
}

intglavni()
{
stroški<<NA::varId << ' n';
stroški<<Opomba:::varId << ' n';

vrnitev 0;
}

Izhod je naslednji:



5
2.3

V zgornjem programu sta dva imenska prostora: NA , ki ima definicijo celega števila, in Opomba: , ki ima definicijo float, vendar z istim imenom kot celo število za NA. Nazadnje, ko je bil program zagnan, je bilo uporabljeno isto ime za dve različni spremenljivki. Upoštevajte, da je za dostop do istega imena dveh različnih spremenljivk potrebno uporabiti posebno ime za imenski prostor, ki mu sledi skupni identifikator. Ime imenskega prostora in skupni identifikator sta ločena z operaterjem ločljivosti področja, :: . Ime imenskih prostorov bo razlikovalo predmete.





Ta članek zajema osnovni koncept imenskega prostora in njegovo uporabo v programskem jeziku C ++. Če želite slediti temu članku, morate imeti osnovno znanje jezika C ++. Prav tako bi morali poznati področje uporabe C ++, čeprav je v tem članku na kratko razloženo. Če želite izvedeti več o obsegu C ++, poiščite frazo Scope v C ++ (brez narekovajev) v iskalnem polju katere koli spletne strani linuxhint.com in pritisnite Enter. To vas bo pripeljalo do članka, ki ga je napisal ta avtor.

Vsebina članka

Kaj je imenski prostor?

Deklarativna regija je največji del programa, v katerem je ime entitete (spremenljivke) veljavno. To območje imenujemo obseg. Imeniški prostor v C ++ je posplošeno področje, katerega glavni namen je reševanje konfliktov imen. Imenski prostor ima osnovne deklaracije in/ali definicije entitet.



Globalni imenski prostor in njegov problem

Globalni imenski prostor je globalno področje uporabe. Razmislite o naslednjem kratkem programu:

#vključi
z uporabo imenskega prostora std;

intident= 55;
plavatiident= 12.17;

intglavni()
{

vrnitev 0;
}

V zgornjem programu obstajata dve spremenljivki, obe imenovani ident . Te spremenljivke so na globalnem področju; to pomeni, da so v globalnem imenskem prostoru. Poskus sestavljanja tega programa s sporočilom o napaki ne bo uspel. Globalno področje uporabe ne sprejema več kot ene spremenljivke z istim imenom, zato je potreben imenski prostor po meri.

Imenski prostor po meri

Imenski prostor nima samo enega imena. Namesto tega ima imenski prostor nabor imen, da se izogne ​​konfliktu z drugimi nabori imen. Da bi se izognili navzkrižju v kodi, pred vsakim imenom navedite ime imenskega prostora in :: . Naslednji program to ponazarja z uporabo dveh imenskih prostorov po meri:

#vključi
z uporabo imenskega prostora std;

imenski prostor NA
{
intvarianta= 6;
plavatiflt;
}

imenski prostor NB
{
intvarianta= 7;
plavatiflt;
}

intglavni()
{
stroški<<NA::varianta << ' n';
stroški<<Opomba:::varianta << ' n';
NA::flt = 2.5;
Opomba:::flt = 4.8;
stroški<<NA::flt << ' n';
stroški<<Opomba:::flt << ' n';

vrnitev 0;
}

Izhod je:

6
7
2.5
4.8

Upoštevajte, da imena NA :: flt in Opomba :: flt so bile nazadnje opredeljene v main () funkcijo. C ++ takšne opredelitve ne dovoljuje v globalnem obsegu.

Upoštevajte, da je imenski prostor po meri ugnezden imenski prostor za globalni imenski prostor.

Direktiva o uporabi

Če se želite izogniti vnašanju imenskega prostora :: name ves čas namesto samo ime po razglasitvi imenskega prostora, lahko uporabite z uporabo direktivo. Sintaksa za uporabo z uporabo direktiva je naslednja:

z imenskim prostorom Namespace_name;

The z uporabo direktiva ni predprocesorska direktiva, zato se konča s podpičjem (;).

Naslednji program ponazarja uporabo z uporabo direktivo in še več:

#vključi
z uporabo imenskega prostora std;

imenski prostor NB
{
intvarianta= 7;
intfunkcijo()
{
vrnitevvarianta;
}
}

intfn()
{
z uporabo imenskega prostora NB;
intmyVar2=funkcijo();
// sledijo drugi predmeti in funkcije iz opombe.
vrnitevmyVar2;
}

intmyVar3=Opomba:::funkcijo();

intglavni()
{
stroški<<fn() << '' <<myVar3<< ' n';

vrnitev 0;
}

Rezultat tega programa je 7 7 . Izraz z uporabo imenskega prostora NB; je bil postavljen na začetek fn () opredelitev. The func () iz imenskega prostora NB se pokliče tik pod tem, brez predhodnega označevanja Opomba :: .

Spremenljivka, deklarirana v globalnem obsegu (globalni imenski prostor), je vidna od točke deklaracije do konca datoteke. To je vidno tudi v ugnezdenih imenskih prostorih (ugnezdenih področjih), kot so ugnezdeni fn () obseg funkcije zgoraj. The z uporabo direktiva se pridruži svojemu imenskemu prostoru od mesta, na katerem je postavljena, do konca področja, v katerem je postavljena.

Ime func () iz imenskega prostora NB ni vidno pod fn () definicija, ker z uporabo imenskega prostora NB; je bil postavljen v obseg funkcije (blok). Pod tem pogojem za uporabo func () zunaj bloka imenskega prostora NB (obseg), mora biti pred njim Opomba :: , kot v naslednji izjavi:

intmyVar3=Opomba:::funkcijo();

The z uporabo direktiva združuje svoj imenski prostor z zunanjim gnezditvenim imenskim prostorom od položaja, na katerem je postavljen, do konca zunanjega gnezdečega imenskega prostora. V naslednjem programu je imenski prostor NA povezan z globalnim imenskim prostorom. Oba imenska prostora se nato razširita v fn () imenski prostor definicije funkcije, v katerem so združeni z imenskim prostorom NB. Imenski prostor NB se konča na koncu fn () funkcijo, dva prejšnja imenska prostora pa trajata do konca datoteke (preberite kodo).

#vključi
z uporabo imenskega prostora std;

imenski prostor NA
{
intvarianta= 6;
intfunkcijo()
{
vrnitevvarianta;
}

}

imenski prostor NB
{
intvarianta= 7;
intfunkcijo()
{
vrnitevvarianta;
}
}

z uporabo imenskega prostora NA;
intmyVar0=varianta;
// sledijo drugi predmeti in funkcije iz :: in NB.

intfn()
{
intmyVar1=varianta;
z uporabo imenskega prostora NB;
intmyVar2=Opomba:::funkcijo();
// sledijo drugi predmeti in funkcije iz NB do konca tega področja uporabe.
vrnitevmyVar1+myVar2;
}

// Sledijo samo predmeti in funkcije iz :: in NB.

intmyVar3=Opomba:::funkcijo();

intglavni()
{
stroški<<myVar0<< '' <<fn() << '' <<myVar3<< ' n';

vrnitev 0;
}

Izhod je 6, 13, 7 .

Opomba: Globalni imenski prostor je označen z :: , kar pomeni, da pred operaterjem ločljivosti področja ni nič.

Pod izjavo je z uporabo imenskega prostora NA; spremenljivke iz globalnega in NA imenskega prostora se lahko uporabljajo brez navedbe izvornega imenskega prostora. Naslednja izjava uporablja varianta imenskega prostora NA. Globalno in NA kombinirano območje imenskega prostora se razteza na fn () imenski prostor funkcije. Torej varianta prve izjave v fn () obseg funkcije, je iz imenskega prostora NA.

Ker se območje globalnega in NA imenskega prostora razteza po vsem fn () obseg, po int myVar2 = NB :: func (); , poljubno ime iz imenskega prostora NB se lahko uporablja samo v fn () obseg, ne da bi ga predhodno označili s Opomba :: , le če se ni pojavil v NA in globalnih imenskih prostorih (blokih). V nasprotnem primeru mora biti pred Opomba :: . Regija kombiniranih imenskih prostorov za NA in globalno se nadaljuje pod fn () definicijo in v main () funkcijo do konca datoteke.

Razširitev imenskega prostora NB se začne od int myVar2 = NB :: func (); v fn () blok in se konča na koncu fn () definicijski blok.

Opomba: Imenski prostori, katerih regije so združene, ne smejo imeti istega imena spremenljivke v različnih blokih imenskega prostora, saj bi to še vedno povzročilo konflikt.

Regije imenskega prostora

Imenski prostor je področje uporabe. Razen globalnega imenskega prostora (globalni obseg) je treba poljuben imenski prostor razglasiti v bloku. Ta blok je prvi del morda porazdeljenih regij imenskega prostora. Z uporabo direktive se lahko imenski prostor razširi kot regije v drugih področjih.

Entitete, deklarirane v telesu imenskega prostora, naj bi bile člani imenskega prostora, imena, ki jih te deklaracije vnesejo v deklarativno področje imenskega prostora, pa naj bi bila imena članov imenskega prostora.

Ugnezdeni imenski prostori

Naslednji program prikazuje ugnezdene imenske prostore:

#vključi
z uporabo imenskega prostora std;

imenski prostor A
{
intjaz= 1;
imenski prostor B
{
intjaz= 2;
imenski prostor C.
{
intjaz= 3;
}
}
}

intglavni()
{
stroški<<TO::jaz << '' <<TO::B::jaz << '' <<TO::B::C::jaz << ' n';

vrnitev 0;
}

Izhod je:

1 2 3

Upoštevajte, da so do treh vrednosti dostopali z operaterjem ločljivosti obsega.

Standardni imenski prostor

C ++ ima knjižnico, imenovano standardna knjižnica. Imena predmetov, funkcij in drugih entitet v tej knjižnici so iz imenskega prostora, imenovanega standardni imenski prostor, zapisanega kot ure . Standardna knjižnica vsebuje podknjižnice in ena od teh podknjižnic je iostream . The iostream knjižnica vsebuje predmet stroški , ki se uporablja za pošiljanje rezultatov na konzolo (terminal).

Ime stroški mora biti v ure imenski prostor. Uporabiti iostream s svojim ure imenski prostor, program naj bo naslednji:

#vključi
z uporabo imenskega prostora std;

Upoštevajte uporabo z uporabo direktivo in ure . Izraz #vključi je predprocesorska direktiva in se ne konča s podpičjem. Vključuje datoteko iostream na mestu svoje direktive.

Zaključek

Imenski prostor je področje uporabe. Opis imenskega prostora (definicija) vsebuje osnovne deklaracije in/ali definicije objektov, funkcij in drugih entitet C ++. Zunaj definicije imenskega prostora lahko do imena dostopate s skladnjo, namespaceName :: ime . Razen globalnega imenskega prostora (globalni obseg) je treba poljuben imenski prostor razglasiti v bloku. Ta blok je prvi del morda porazdeljenih regij imenskega prostora. S z uporabo direktivo, se lahko imenski prostor razširi kot regije na drugih področjih. Imenski prostori, katerih regije so združene, ne smejo imeti istega imena spremenljivke v različnih blokih imenskega prostora, saj bi to še vedno povzročilo navzkrižje imen.

Chrys