C ++

C ++ prostor imena

C ++ prostor imena
Prostor imena u C ++-u generalizirani je opseg. Njegova deklaracija započinje rezerviranom riječju, imenskim prostorom, slijedi ime po izboru programera, a zatim blok u zagradama. Blok sadrži osnovne deklaracije i / ili definicije C ++ objekata, funkcija i drugih entiteta.

Razmotrite sljedeće dvije skalarne izjave u globalnom opsegu u sljedećem programu:

#include
pomoću prostora imena std;
int varId = 5;
float varId = 2.3;
int main ()

return 0;

Pokušaj kompajliranja ovog programa dovodi do pogreške u kompilaciji. Postoje dvije varijable s istim imenom, VarId. Iako su to dvije različite varijable dvije različite vrste, int i plutati, sastavljač odbija dvije deklaracije jer su istoimene. Sljedeći program rješava ovaj problem deklariranjem istovjetnih varijabli u dva različita generalizirana opsega:

#include
pomoću prostora imena std;
prostor imena NA

int varId = 5;

prostor imena NB

plutajuća varId = 2.3;

int main ()

cout << NA::varId << '\n';
cout << NB::varId << '\n';
return 0;

Izlaz je sljedeći:

5
2.3

Postoje dva prostora imena u gornjem programu: NA, koji ima definiciju cijelog broja i Napomena:, koja ima definiciju float-a, ali s istim imenom kao i cijeli broj za NA. Konačno, kada je program pokrenut, korišteno je isto ime za dvije različite varijable. Imajte na umu da se za pristup istom imenu dviju različitih varijabli mora koristiti određeno ime za prostor imena, nakon čega slijedi zajednički identifikator. Naziv prostora imena i zajednički identifikator razdvaja operater razlučivosti opsega, “::.”Ime prostora imena razlikovat će objekte.

Ovaj članak pokriva osnovni koncept prostora imena i njegovu upotrebu u programskom jeziku C ++. Da biste slijedili ovaj članak, trebali biste imati osnovno znanje jezika C ++. Trebali biste znati i o opsegu C ++, iako je to ukratko objašnjeno u ovom članku. Da biste saznali više o opsegu C ++, potražite frazu "Opseg u C ++" (bez navodnika) u okviru za pretraživanje bilo kojeg linuxhint-a.com web stranicu i pritisnite Enter. To će vas odvesti do članka koji je ovaj autor napisao.

Sadržaj članka

Što je prostor imena?

Deklarativna regija najveći je dio programa u kojem vrijedi naziv entiteta (varijable). Ova se regija naziva opseg. Prostor imena u C ++-u generalizirani je opseg čija je glavna svrha rješavanje sukoba imena. Prostor imena ima osnovne deklaracije i / ili definicije entiteta.

Globalni prostor imena i njegov problem

Globalni prostor imena globalni je opseg. Razmotrite sljedeći kratki program:

#include
pomoću prostora imena std;
int ident = 55;
plutajuće ident = 12.17;
int main ()

return 0;

U gornjem programu postoje dvije varijable, obje pozvane ident. Te su varijable u globalnom opsegu; odnosno nalaze se u globalnom prostoru imena. Pokušaj kompajliranja ovog programa neće uspjeti s porukom o pogrešci. Globalni opseg ne prihvaća više od jedne varijable s istim imenom, pa postoji potreba za prilagođenim prostorom imena.

Prilagođeni prostor imena

Prostor imena nema samo jedno ime. Umjesto toga, prostor imena ima skup imena kako bi se izbjegao sukob s drugim skupovima imena. Da biste izbjegli sukob niže u kodu, ispred svakog imena dodajte naziv prostora imena i :: . Sljedeći program to ilustrira pomoću dva prilagođena prostora imena:

#include
pomoću prostora imena std;
prostor imena NA

int varInt = 6;
float flt;

prostor imena NB

int varInt = 7;
float flt;

int main ()

cout << NA::varInt << '\n';
cout << NB::varInt << '\n';
NA :: flt = 2.5;
Napomena: flt = 4.8;
cout << NA::flt << '\n';
cout << NB::flt << '\n';
return 0;

Izlaz je:

6
7
2.5
4.8

Imajte na umu da imena NA :: flt i Napomena: flt su u konačnici definirani u glavni() funkcija. C ++ ne dopušta takvu definiciju u globalnom opsegu.

Imajte na umu da je prilagođeni prostor imena ugniježđeni prostor imena za globalni prostor imena.

Direktiva o korištenju

Da biste izbjegli stalno upisivanje "namepace :: name" umjesto samo "name" nakon deklariranja prostora imena, možete upotrijebiti koristeći direktiva. Sintaksa za upotrebu koristeći Direktiva je sljedeća:

pomoću prostora imena Ime_prostora;

The koristeći direktiva nije pretprocesorska direktiva, pa završava zarezom (;).

Sljedeći program ilustrira upotrebu koristeći direktiva i više:

#include
pomoću prostora imena std;
prostor imena NB

int varInt = 7;
int func ()

povratak varInt;


int fn ()

pomoću prostora imena NB;
int myVar2 = func ();
// slijede drugi objekti i funkcije iz NB-a.
vrati myVar2;

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

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

Rezultat ovog programa je 7 7. Uvjet "pomoću prostora imena NB;"Postavljen je na početak fn () definicija. The func () iz prostora imena NB-a naziva se odmah ispod toga, bez prethodne riječi "Napomena ::."

Varijabla deklarirana u globalnom opsegu (globalni prostor imena) vidi se od točke deklaracije do kraja datoteke. Također se vidi u ugniježđenim prostorima imena (ugniježđeni opsezi), poput ugniježđenih fn () gornji opseg funkcije. The koristeći direktiva pridružuje svoj prostor imena od položaja na kojem se nalazi do kraja opsega u kojem je smještena.

Ime func () iz NB prostora imena ne može se vidjeti ispod fn () definicija jer „koristeći prostor imena NB; " je smješteno unutar opsega funkcije (blok). Pod ovim uvjetom, za upotrebufunc ()"Izvan bloka prostora NB (opsega), mora mu prethoditi"Napomena ::,”Kao u sljedećoj izjavi:

int myVar3 = NB :: func ();

The koristeći direktiva spaja svoj prostor imena s vanjskim prostorom gniježđenja od položaja na kojem se nalazi do kraja vanjskog prostora gniježđenja. U sljedećem programu prostor imena NA pridružen je globalnom prostoru imena. Oba se imenska prostora zatim proširuju na fn () prostor imena definicije funkcije, u kojem su spojeni s prostorom imena NB. Prostor imena NB završava na kraju fn () definicija funkcije, a dva prethodna imenska prostora nastavljaju se do kraja datoteke (pročitajte kôd).

#include
pomoću prostora imena std;
prostor imena NA

int varInt = 6;
int func ()

povratak varInt;


prostor imena NB

int varInt = 7;
int func ()

povratak varInt;


pomoću prostora imena NA;
int myVar0 = varInt;
// slijede ostali objekti i funkcije iz :: i NB.
int fn ()

int myVar1 = varInt;
pomoću prostora imena NB;
int myVar2 = NB :: func ();
// slijede ostali objekti i funkcije iz NB-a, do kraja ovog opsega.
vrati myVar1 + myVar2;

// Slijede samo objekti i funkcije iz :: i NB.
int myVar3 = NB :: func ();
int main ()

cout << myVar0 << " << fn() << " << myVar3 << '\n';
return 0;

Izlaz je 6, 13, 7.

Bilješka: Globalni prostor imena označen je s :: , što znači da prije operatora razlučivanja opsega nema ničega što slijedi.

Ispod izjave, “pomoću prostora imena NA;”Varijable iz globalnog i NA prostora prostora mogu se koristiti bez naznake njihovog izvornog prostora imena. Sljedeća izjava koristi varInt prostora imena NA. Globalno i NA kombinirano područje prostora imena širi se na fn () prostor imena funkcija. Dakle, varInt prve izjave u fn () opseg funkcije je prostora imena NA.

Budući da se regija za globalni i NA prostor prostora prostire kroz fn () opseg, nakon „int myVar2 = NB :: func ();,”Bilo koje ime iz NB prostora imena može se koristiti samo u fn () opseg bez da mu prethodi “Napomena ::,”Samo ako se nije dogodilo u NA i globalnim imenskim prostorima (blokovima). Inače, tome treba prethoditi „Napomena ::.”Regija kombiniranih prostora imena za NA i global nastavlja se ispod fn () definicija i u glavni() funkcija do kraja datoteke.

Proširenje prostora imena NB započinje od “int myVar2 = NB :: func ();”U fn () blok i završava na kraju fn () blok definicije.

Bilješka: Prostori imena čija su područja spojena ne bi trebali imati isto ime varijable u svojim različitim blokovima imenskog prostora, jer bi to i dalje moglo uzrokovati sukob.

Regije prostora imena

Prostor imena je opseg. Osim globalnog prostora imena (globalni opseg), svaki prostor imena treba deklarirati u bloku. Taj je blok prvi dio moguće distribuiranih regija prostora imena. Pomoću direktive using, prostor imena može se proširiti kao regije u drugim opsezima.

Za entitete deklarirane u tijelu prostora imena kaže se da su članovi prostora imena, a za imena koja su uvedene tim deklaracijama u deklarativno područje prostora imena imenuju se članovi imena prostora prostora.

Ugnježđeni imenski prostori

Sljedeći program prikazuje ugniježđene prostore imena:

#include
pomoću prostora imena std;
prostor imena A

int i = 1;
prostor imena B

int i = 2;
prostor imena C

int i = 3;



int main ()

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

Izlaz je:

1 2 3

Primijetite da su se tim vrijednostima pristupilo pomoću operatora razlučivanja opsega.

Standardni prostor imena

C ++ ima knjižnicu koja se naziva standardna knjižnica. Imena objekata, funkcija i drugih entiteta u ovoj knjižnici potječu iz prostora imena koji se naziva standardni prostor imena, zapisan kao std. Standardna knjižnica sadrži podbiblioteke, a jedna od tih podbiblioteka je iostream. The iostream knjižnica sadrži objekt cout, koji se koristi za slanje rezultata na konzolu (terminal).

Ime cout mora biti u std prostor imena. Koristiti iostream sa svojim std prostor imena, program bi trebao biti sljedeći:

#include
pomoću prostora imena std;

Obratite pažnju na upotrebu koristeći direktiva i std. Uvjet "#include ”Je direktiva o pretprocesoru i ne završava zarezom. Uključuje iostream "datoteku" na mjestu svoje direktive.

Zaključak

Prostor imena je opseg. Opis (definicija) prostora imena sadrži osnovne deklaracije i / ili definicije C ++ objekata, funkcija i drugih entiteta. Izvan definicije prostora imena, imenu se može pristupiti sintaksom, “namespaceName :: name.”Osim globalnog prostora imena (globalni opseg), svaki prostor imena treba deklarirati u bloku. Taj je blok prvi dio moguće distribuiranih regija prostora imena. Uz koristeći direktive, prostor imena može se proširiti kao regije u drugim opsezima. Prostori imena čija su područja spojena ne bi trebali imati isto ime varijable u svojim različitim blokovima imenskog prostora, jer bi to i dalje uzrokovalo sukob imena.

Chrys

OpenTTD vs Simutrans
Stvaranje vlastite simulacije prijevoza može biti zabavno, opuštajuće i izuzetno primamljivo. Zbog toga morate isprobati što više igara kako biste pro...
Vodič za OpenTTD
OpenTTD je jedna od najpopularnijih igara za poslovnu simulaciju. U ovoj igri morate stvoriti prekrasan prijevoznički posao. Međutim, počet ćete u poč...
SuperTuxKart za Linux
SuperTuxKart sjajan je naslov osmišljen kako bi vam besplatno pružio iskustvo Mario Kart na vašem Linux sustavu. Prilično je izazovno i zabavno igrati...