Spațiu de nume C ++

C Namespace



Un spațiu de nume în C ++ este un domeniu generalizat. Declarația sa începe cu cuvântul rezervat, spațiu de nume, urmat de un nume la alegerea programatorului și apoi de blocul între paranteze. Blocul conține declarații de bază și / sau definiții ale obiectelor, funcțiilor și altor entități C ++.

Luați în considerare următoarele două instrucțiuni scalare într-un domeniu global, în următorul program:







#include
folosind spațiul de nume std;

intvarId= 5;
plutivarId= 2.3;

intprincipal()
{

întoarcere 0;
}

O încercare de a compila acest program duce la o eroare de compilare. Există două variabile cu același nume, varId . Deși sunt două variabile diferite de două tipuri diferite, int și pluti , compilatorul respinge cele două declarații deoarece sunt cu același nume. Următorul program rezolvă această problemă declarând variabilele cu același nume în două domenii generalizate diferite:



#include
folosind spațiul de nume std;

spațiu de nume NA
{
intvarId= 5;
}

spațiu de nume NB
{
plutivarId= 2.3;
}

intprincipal()
{
cost<<N / A::varId << ' n';
cost<<NB::varId << ' n';

întoarcere 0;
}

Ieșirea este după cum urmează:



5
2.3

Există două spații de nume în programul de mai sus: N / A , care are definiția unui număr întreg și NB , care are definiția unui float, dar cu același nume ca întregul pentru NA. În cele din urmă, când programul a fost rulat, a fost utilizat același nume pentru două variabile diferite. Rețineți că pentru a accesa același nume a două variabile diferite, trebuie utilizat numele special pentru spațiul de nume, urmat de identificatorul comun. Numele spațiului de nume și identificatorul comun sunt separate de operatorul de rezoluție a domeniului, :: . Numele spațiilor de nume va diferenția obiectele.





Acest articol acoperă conceptul de bază al unui spațiu de nume și utilizarea acestuia în limbajul de programare C ++. Pentru a urma acest articol, ar trebui să aveți cunoștințe de bază despre limbajul C ++. De asemenea, ar trebui să aveți cunoștințe despre domeniul C ++, deși este explicat pe scurt în acest articol. Pentru a afla mai multe despre domeniul de aplicare C ++, căutați expresia, Scope în C ++ (fără ghilimele) în caseta de căutare a oricărei pagini web linuxhint.com și apăsați Enter. Acest lucru vă va conduce la articolul scris de acest autor.

Conținutul articolului

Ce este un spațiu de nume?

O regiune declarativă este cea mai mare parte a unui program în care numele unei entități (variabilă) este valid. Această regiune se numește domeniu de aplicare. Un spațiu de nume în C ++ este un domeniu generalizat al cărui scop principal este rezolvarea conflictelor de nume. Un spațiu de nume are declarații de bază și / sau definiții ale entităților.



Spațiul de nume global și problema sa

Spațiul de nume global este domeniul de aplicare global. Luați în considerare următorul program scurt:

#include
folosind spațiul de nume std;

intident= 55;
plutiident= 12.17;

intprincipal()
{

întoarcere 0;
}

În programul de mai sus, există două variabile, ambele numite ident . Aceste variabile sunt în domeniul global; adică se află în spațiul de nume global. O încercare de a compila acest program va eșua cu un mesaj de eroare. Domeniul global nu acceptă mai multe variabile cu același nume, deci este nevoie de un spațiu de nume personalizat.

Spațiu de nume personalizat

Un spațiu de nume nu are un singur nume. În schimb, un spațiu de nume are un set de nume pentru a evita conflictul cu alte seturi de nume. Pentru a evita conflictul mai mic în cod, precede fiecare nume cu numele spațiului de nume și :: . Următorul program ilustrează acest lucru folosind două spații de nume personalizate:

#include
folosind spațiul de nume std;

spațiu de nume NA
{
intvarInt= 6;
plutiflt;
}

spațiu de nume NB
{
intvarInt= 7;
plutiflt;
}

intprincipal()
{
cost<<N / A::varInt << ' n';
cost<<NB::varInt << ' n';
N / A::flt = 2.5;
NB::flt = 4.8;
cost<<N / A::flt << ' n';
cost<<NB::flt << ' n';

întoarcere 0;
}

Ieșirea este:

6
7
2.5
4.8

Rețineți că numele NA :: flt și NB :: flt au fost definite în cele din urmă în principal() funcţie. C ++ nu permite o astfel de definiție în domeniul global.

Rețineți că spațiul de nume personalizat este un spațiu de nume imbricat pentru spațiul de nume global.

Directiva privind utilizarea

Pentru a evita să tastați namepace :: name tot timpul în loc de doar nume după declararea spațiului de nume, puteți utiliza folosind directivă. Sintaxa utilizării folosind directiva este după cum urmează:

folosind spațiul de nume nume de spațiu de nume;

The folosind directiva nu este o directivă preprocesator, deci se termină cu punct și virgulă (;).

Următorul program ilustrează utilizarea fișierului folosind directivă și multe altele:

#include
folosind spațiul de nume std;

spațiu de nume NB
{
intvarInt= 7;
intfunc()
{
întoarcerevarInt;
}
}

intfn()
{
folosind spațiul de nume NB;
intmyVar2=func();
// urmează alte obiecte și funcții din NB.
întoarceremyVar2;
}

intmyVar3=NB::func();

intprincipal()
{
cost<<fn() << '' <<myVar3<< ' n';

întoarcere 0;
}

Ieșirea acestui program este 7 7 . Termenul utilizarea spațiului de nume NB; a fost plasat la începutul anului fn () definiție. The func() din spațiul de nume NB este numit chiar sub acesta, fără a fi precedat de NB :: .

O variabilă declarată în domeniul global (spațiu de nume global) este văzută de la punctul de declarație până la sfârșitul fișierului. Se vede și în spațiile de nume imbricate (domeniile imbricate), cum ar fi cele imbricate fn () funcția de mai sus. The folosind directiva își alătură spațiul de nume de la poziția în care este plasată până la sfârșitul domeniului în care este plasată.

Numele func() din spațiul de nume NB nu poate fi văzut sub fn () definiție pentru că utilizarea spațiului de nume NB; a fost plasat în sfera funcției (bloc). În această condiție, de utilizat func() în afara blocului spațiului de nume NB (domeniul de aplicare), acesta trebuie să fie precedat de NB :: , ca în următoarea afirmație:

intmyVar3=NB::func();

The folosind directiva își unește spațiul de nume cu spațiul de nume de cuibărire exterior de la poziția în care este plasat până la capătul spațiului de nume de cuibărire exterior. În următorul program, spațiul de nume NA este alăturat spațiului de nume global. Ambele spații de nume se extind apoi în fn () spațiul de nume de definiție a funcției, în care sunt unite cu spațiul de nume NB. Spațiul de nume NB se încheie la sfârșitul fișierului fn () definiția funcției și cele două spații de nume anterioare continuă până la sfârșitul fișierului (citit prin cod).

#include
folosind spațiul de nume std;

spațiu de nume NA
{
intvarInt= 6;
intfunc()
{
întoarcerevarInt;
}

}

spațiu de nume NB
{
intvarInt= 7;
intfunc()
{
întoarcerevarInt;
}
}

folosind spațiul de nume NA;
intmyVar0=varInt;
// urmează alte obiecte și funcții din :: și NB.

intfn()
{
intmyVar1=varInt;
folosind spațiul de nume NB;
intmyVar2=NB::func();
// urmează alte obiecte și funcții din NB, până la sfârșitul acestui domeniu.
întoarceremyVar1+myVar2;
}

// Urmează doar obiectele și funcțiile din :: și NB.

intmyVar3=NB::func();

intprincipal()
{
cost<<myVar0<< '' <<fn() << '' <<myVar3<< ' n';

întoarcere 0;
}

Ieșirea este 6, 13, 7 .

Notă: Spațiul de nume global este indicat cu :: , ceea ce înseamnă că nu există nimic înaintea operatorului de rezoluție a domeniului care urmează.

Sub declarație, folosind spațiul de nume NA; variabilele din spațiul de nume global și NA pot fi utilizate fără indicarea spațiului de nume sursă. Următoarea declarație folosește varInt a spațiului de nume NA. Regiunea spațiului de nume combinat global și NA se extinde în fn () funcție spațiu de nume. Asa ca varInt a primei afirmații din fn () sfera funcției, este din spațiul de nume NA.

Întrucât regiunea pentru spațiile de nume globale și NA se extinde pe întreg teritoriul fn () domeniul de aplicare, după int myVar2 = NB :: func (); , orice nume din spațiul de nume NB poate fi utilizat numai în fn () sfera de aplicare fără a o precedă cu NB :: , numai dacă nu a apărut în spațiile de nume NA și globale (blocuri). În caz contrar, ar trebui să fie precedat de NB :: . Regiunea spațiilor de nume combinate pentru NA și global continuă sub fn () definiție și în principal() funcția până la sfârșitul fișierului.

Extensia spațiului de nume NB începe de la int myVar2 = NB :: func (); în fn () bloc și se termină la sfârșitul fn () bloc de definiție.

Notă: Spațiile de nume ale căror regiuni sunt unite nu ar trebui să aibă același nume de variabilă în blocurile lor diferite de spațiu de nume, deoarece acest lucru ar cauza totuși conflicte.

Regiuni spațiu de nume

Un spațiu de nume este un domeniu de aplicare. În afară de spațiul de nume global (scop global), orice spațiu de nume trebuie declarat într-un bloc. Blocul respectiv este prima parte a regiunilor distribuite posibil ale spațiului de nume. Cu directiva de utilizare, spațiul de nume poate fi extins ca regiuni în alte domenii.

Se spune că entitățile declarate într-un corp de spațiu de nume sunt membre ale spațiului de nume, iar numele introduse de aceste declarații în regiunea declarativă a spațiului de nume se spune că sunt nume de membri ale spațiului de nume.

Spații de nume imbricate

Următorul program prezintă spații de nume imbricate:

#include
folosind spațiul de nume std;

spațiul de nume A
{
inteu= 1;
spațiul de nume B
{
inteu= 2;
spațiul de nume C
{
inteu= 3;
}
}
}

intprincipal()
{
cost<<LA::eu << '' <<LA::B::eu << '' <<LA::B::C::eu << ' n';

întoarcere 0;
}

Ieșirea este:

1 2 3

Observați că cele trei valori au fost accesate folosind operatorul de rezoluție a scopului.

Spațiu de nume standard

C ++ are o bibliotecă numită bibliotecă standard. Numele obiectelor, funcțiilor și altor entități din această bibliotecă provin dintr-un spațiu de nume numit spațiu de nume standard, scris ca ore . Biblioteca standard conține sub-biblioteci, iar una dintre aceste sub-biblioteci este iostream . The iostream biblioteca conține obiectul cost , care este folosit pentru a trimite rezultate către consolă (terminal).

Numele cost trebuie să fie în ore spațiu de nume. A folosi iostream cu al ei; cu al lui ore spațiul de nume, programul ar trebui să fie după cum urmează:

#include
folosind spațiul de nume std;

Rețineți utilizarea fișierului folosind directivă și ore . Termenul #include este o directivă de preprocesare și nu se termină cu punct și virgulă. Acesta include fișierul iostream la poziția directivei sale.

Concluzie

Un spațiu de nume este un domeniu de aplicare. Descrierea (definiția) spațiului de nume conține declarații de bază și / sau definiții ale obiectelor, funcțiilor și altor entități C ++. În afara definiției spațiului de nume, numele poate fi accesat cu sintaxa, namespaceName :: nume . În afară de spațiul de nume global (scop global), orice spațiu de nume trebuie declarat într-un bloc. Blocul respectiv este prima parte a regiunilor distribuite posibil ale spațiului de nume. Cu folosind directivă, spațiul de nume poate fi extins ca regiuni în alte domenii. Spațiile de nume ale căror regiuni sunt unite nu ar trebui să aibă același nume de variabilă în blocurile lor diferite de spațiu de nume, deoarece acest lucru ar cauza totuși un conflict de nume.

Chrys