logo

Spațiul de nume în C++ | Setul 1 (Introducere)

  • Spațiul de nume oferă spațiul în care putem defini sau declara identificatorul, adică variabilă, metodă, clase.
  • Folosind spațiul de nume, puteți defini spațiul sau contextul în care sunt definiți identificatorii, adică variabilă, metodă, clase. În esență, un spațiu de nume definește un domeniu.

Avantajul Namespace pentru a evita coliziunea de nume.

  • De exemplu, este posibil să scrieți un cod care are o funcție numită xyz() și există o altă bibliotecă disponibilă care are, de asemenea, aceeași funcție xyz(). Acum compilatorul nu are de unde să știe la ce versiune a funcției xyz() vă referiți în codul dvs.
  • Un spațiu de nume este conceput pentru a depăși această dificultate și este folosit ca informații suplimentare pentru a diferenția funcții, clase, variabile etc. similare cu același nume disponibil în biblioteci diferite.
  • Cel mai bun exemplu de domeniul de aplicare al spațiului de nume este biblioteca standard C++ (std) în care sunt declarate toate clasele, metodele și șabloanele. Prin urmare, în timp ce scriem un program C++, de obicei includem directiva folosind namespace std;

Definirea unui spatiu de nume:

  • O definiție de spațiu de nume începe cu cuvântul cheie spațiu de nume urmat de numele spațiului de nume, după cum urmează:
namespace namespace_name { // code declarations i.e. variable (int a;) method (void add();) classes ( class student{};) }>
  • Este de remarcat faptul că, după acolada de închidere, nu există punct și virgulă (;).
  • Pentru a apela versiunea activată pentru spațiu de nume a fiecărei funcții, fie a variabilei, adăugați numele spațiului de nume după cum urmează:
  • namespace_name: :cod; // codul poate fi variabil, funcție sau clasă.

Directiva de utilizare:

  • De asemenea, puteți evita antepunerea spațiilor de nume cu directiva using namespace. Această directivă îi spune compilatorului că codul următor folosește nume în spațiul de nume specificat.
  • Spațiul de nume este astfel implicat pentru următorul cod:

C++








#include> using> namespace> std;> // first name space> namespace> first_space> {> >void> func()> >{> >cout <<>'Inside first_space'> << endl;> >}> }> // second name space> namespace> second_space> {> >void> func()> >{> >cout <<>'Inside second_space'> << endl;> >}> }> using> namespace> first_space;> int> main ()> {> >// This calls function from first name space.> >func();> >return> 0;> }>

>



>

Ieșire

Inside first_space>
  • Numele introduse într-o directivă de utilizare respectă regulile de aplicare normale. Numele este vizibil de la punctul directivei de utilizare până la sfârșitul domeniului de aplicare în care se găsește directiva. Entitățile cu același nume definite într-un domeniu exterior sunt ascunse.

Spații de nume imbricate:

  • Spațiile de nume pot fi imbricate, unde puteți defini un spațiu de nume în interiorul altui spațiu de nume, după cum urmează:
SYNTAX: namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }>

Puteți accesa membrii spațiului de nume imbricat utilizând operatori de rezoluție, după cum urmează:
// pentru a accesa membrii namespace_name2
folosind namespace namespace_name1::namespace_name2;
// pentru a accesa membrii namespace_name1
folosind spațiul de nume nume_spațiu1;

În declarațiile de mai sus, dacă utilizați namespace_name1, atunci va face disponibile elemente ale namespace_name2 în domeniul de aplicare, după cum urmează:

C++




#include> using> namespace> std;> // first name space> namespace> first_space> {> >void> func()> >{> >cout <<>'Inside first_space'> << endl;> >}> >// second name space> >namespace> second_space> >{> >void> func()> >{> >cout <<>'Inside second_space'> << endl;> >}> >}> }> using> namespace> first_space::second_space;> int> main ()> {> >// This calls function from second name space.> >func();> > >return> 0;> }>

>

>

Ieșire

Inside second_space>

Să vedem cum spațiul de nume acoperă entitățile, inclusiv variabilele și funcțiile:

C++




#include> using> namespace> std;> // first name space> namespace> first_space> {> >void> func()> >{> >cout <<>'Inside first_space'> << endl;> >}> }> // second name space> namespace> second_space> {> >void> func()> >{> >cout <<>'Inside second_space'> << endl;> >}> }> int> main ()> {> >// Calls function from first name space.> >first_space :: func();> >// Calls function from second name space.> >second_space :: func();> >return> 0;> }>

>

>

Ieșire

Inside first_space Inside second_space>

Luați în considerare următorul program C++:

CPP




// A program to demonstrate need of namespace> int> main()> {> >int> value;> >value = 0;> >double> value;>// Error here> >value = 0.0;> }>

conversia șir în întreg

>

>

Ieșire:

Compiler Error: 'value' has a previous declaration as 'int value'>

În fiecare domeniu, un nume poate reprezenta doar o entitate. Deci, nu pot exista două variabile cu același nume în același domeniu. Folosind spații de nume, putem crea două variabile sau funcții membre având același nume.

CPP




// Here we can see that more than one variables> // are being used without reporting any error.> // That is because they are declared in the> // different namespaces and scopes.> #include> using> namespace> std;> // Variable created inside namespace> namespace> first {> int> val = 500;> }> // Global variable> int> val = 100;> int> main()> {> >// Local variable> >int> val = 200;> >// These variables can be accessed from> >// outside the namespace using the scope> >// operator ::> >cout << first::val <<>' '>;> >return> 0;> }>

>

>

Ieșire

500>

Definiție și creare: Spațiile de nume ne permit să grupăm entități cu nume pe care altfel le-ar avea amploare globală în domenii mai înguste, dându-le domeniul de aplicare al spațiului de nume . Acest lucru permite organizarea elementelor programelor în diferite domenii logice la care se face referire prin nume. Spațiile de nume oferă spațiul în care putem defini sau declara identificatori, adică nume de variabile, metode, clase etc.

  • Un spațiu de nume este o caracteristică adăugată în C++ și nu este prezentă în C.
  • Un spațiu de nume este o regiune declarativă care oferă un domeniu de aplicare pentru identificatorii (nume de funcții, variabile sau alte tipuri de date definite de utilizator) din interiorul acestuia.
  • Sunt permise mai multe blocuri de spații de nume cu același nume. Toate declarațiile din acele blocuri sunt declarate în domeniul de aplicare numit.

O definiție de spațiu de nume începe cu cuvântul cheie spatiu de nume urmat de numele spațiului de nume, după cum urmează:

namespace namespace_name { int x, y; // code declarations where // x and y are declared in // namespace_name's scope }>
  • Declarațiile de spațiu de nume apar numai la nivel global.
  • Declarațiile de spațiu de nume pot fi imbricate într-un alt spațiu de nume.
  • Declarațiile de spațiu de nume nu au specificatori de acces (Public sau Privat).
  • Nu este nevoie să dați un punct și virgulă după acolada de închidere a definiției spațiului de nume.
  • Putem împărți definiția spațiului de nume pe mai multe unități.

Definirea unui spatiu de nume:

O definiție de spațiu de nume începe cu cuvântul cheie spațiu de nume urmat de numele spațiului de nume, după cum urmează:

C++




namespace> namespace_name{> >// code declarations i.e. variable (int a;)> >method (>void> add();)> >classes (>class> student{};)> }>

>

>

Este de remarcat că nu există punct și virgulă (;) după acolada de închidere.
Pentru a apela versiunea activată pentru spațiu de nume a unei funcții sau a unei variabile, adăugați numele spațiului de nume după cum urmează:

namespace_name: :cod; // codul ar putea fi o variabilă, o funcție sau o clasă.

C++




// Let us see how namespace scope the entities including variable and functions:> #include> using> namespace> std;> // first name space> namespace> first_space> {> >void> func()> >{> >cout <<>'Inside first_space'> << endl;> >}> }> // second name space> namespace> second_space> {> >void> func()> >{> >cout <<>'Inside second_space'> << endl;> >}> }> int> main ()> {> >// Calls function from first name space.> >first_space::func();> >// Calls function from second name space.> >second_space::func();> >return> 0;> }> // If we compile and run above code, this would produce the following result:> // Inside first_space> // Inside second_space>

>

>

Ieșire

Inside first_space Inside second_space>

Directiva de utilizare:

Puteți evita antecedentele spațiilor de nume cu directiva using namespace. Această directivă îi spune compilatorului că codul următor folosește nume în spațiul de nume specificat. Spațiul de nume este astfel implicat pentru următorul cod:

C++




#include> using> namespace> std;> // first name space> namespace> first_space> {> >void> func()> >{> >cout <<>'Inside first_space'> << endl;> >}> }> // second name space> namespace> second_space> {> >void> func()> >{> >cout <<>'Inside second_space'> << endl;> >}> }> using> namespace> first_space;> int> main ()> {> >// This calls function from first name space.> >func();> >return> 0;> }> // If we compile and run above code, this would produce the following result:> // Inside first_space>

>

>

Ieșire

Inside first_space>

În loc să accesați întregul spațiu de nume, o altă opțiune (cunoscută ca folosind declarație) este de a accesa un anumit articol dintr-un spațiu de nume. De exemplu, dacă singura parte a spațiului de nume std pe care intenționați să o utilizați este cout, vă puteți referi la el după cum urmează:
folosind std::cout;
Codul următor se poate referi la cout fără a adăuga spațiul de nume, dar alte elemente din spațiul de nume standard vor trebui totuși să fie explicite, după cum urmează:

C++




#include> using> std::cout;> int> main ()> {> >cout <<>'std::endl is used with std!'> << std::endl;> >return> 0;> }>

>

>

Ieșire

std::endl is used with std!>

Numele introduse într-o directivă de utilizare respectă regulile de aplicare normale, adică sunt vizibile din punctul în care apare directiva de utilizare până la sfârșitul domeniului de aplicare în care se găsește directiva. Entitățile cu același nume definite într-un domeniu exterior sunt ascunse.

C++




// Creating namespaces> #include> using> namespace> std;> namespace> ns1 {> int> value() {>return> 5; }> }>// namespace ns1> namespace> ns2 {> const> double> x = 100;> double> value() {>return> 2 * x; }> }>// namespace ns2> int> main()> {> >// Access value function within ns1> >cout << ns1::value() <<>' '>;> >// Access value function within ns2> >cout << ns2::value() <<>' '>;> >// Access variable x directly> >cout << ns2::x <<>' '>;> >return> 0;> }>

>

>

Ieșire:

5 200 100>

Clase și spațiu de nume: Următoarea este o modalitate simplă de a crea clase într-un spațiu de nume:

C++




// A C++ program to demonstrate use of class> // in a namespace> #include> using> namespace> std;> namespace> ns> {> >// A Class in a namespace> >class> geek> >{> >public>:> >void> display()> >{> >cout<<>'ns::geek::display()'>< } }; } int main() { // Creating Object of geek Class ns::geek obj; obj.display(); return 0; }>

>

>

Ieșire

ns::geek::display()>

O clasă poate fi, de asemenea, declarată în interiorul spațiului de nume și definită în afara spațiului de nume folosind următoarea sintaxă:

CPP




// A C++ program to demonstrate use of class> // in a namespace> #include> using> namespace> std;> namespace> ns {> // Only declaring class here> class> geek;> }>// namespace ns> // Defining class outside> class> ns::geek {> public>:> >void> display() { cout <<>'ns::geek::display() '>; }> };> int> main()> {> >// Creating Object of geek Class> >ns::geek obj;> >obj.display();> >return> 0;> }>

>

>

Ieșire

ns::geek::display()>

Putem defini metode și în afara spațiului de nume . Următorul este un exemplu de cod:

C++




// A C++ code to demonstrate that we can define> // methods outside namespace.> #include> using> namespace> std;> // Creating a namespace> namespace> ns {> void> display();> class> geek {> public>:> >void> display();> };> }>// namespace ns> // Defining methods of namespace> void> ns::geek::display()> {> >cout <<>'ns::geek::display() '>;> }> void> ns::display() { cout <<>'ns::display() '>; }> // Driver code> int> main()> {> >ns::geek obj;> >ns::display();> >obj.display();> >return> 0;> }>

>

>

Ieșire:

k algoritmul celui mai apropiat vecin
ns::display() ns::geek::display():>

Spații de nume imbricate:

Spațiile de nume pot fi imbricate, adică puteți defini un spațiu de nume în interiorul altui spațiu de nume, după cum urmează:

C++




namespace> namespace_name1 {> >// code declarations> >namespace> namespace_name2 {> >// code declarations> >}> }>

>

>

Puteți accesa membrii unui spațiu de nume imbricat utilizând operatorul de rezoluție (::) după cum urmează:

C++




// to access members of namespace_name2> using> namespace> namespace_name1::namespace_name2;> // to access members of namespace:name1> using> namespace> namespace_name1;>

>

>

În declarațiile de mai sus, dacă utilizați namespace_name1, atunci va face ca elementele namespace_name2 să fie disponibile în domeniul de aplicare, după cum urmează:

C++




#include> using> namespace> std;> // first name space> namespace> first_space> {> >void> func()> >{> >cout <<>'Inside first_space'> << endl;> >}> >// second name space> >namespace> second_space> >{> >void> func()> >{> >cout <<>'Inside second_space'> << endl;> >}> >}> }> using> namespace> first_space::second_space;> int> main ()> {> > >// This calls function from second name space.> >func();> > >return> 0;> }> // If we compile and run above code, this would produce the following result:> // Inside second_space>

>

>

Ieșire

Inside second_space>

Spațiul de nume oferă avantajul de a evita coliziunea de nume: -

De exemplu, este posibil să scrieți un cod care are o funcție numită xyz() și există o altă bibliotecă disponibilă în codul dvs. care are și aceeași funcție xyz(). Acum compilatorul nu are de unde să știe la ce versiune a funcției xyz() vă referiți în codul dvs.
Un spațiu de nume este conceput pentru a depăși această dificultate și este folosit ca informații suplimentare pentru a diferenția funcții, clase, variabile etc. similare cu același nume disponibile în biblioteci diferite.
Cel mai bun exemplu de domeniul de aplicare al spațiului de nume este biblioteca standard C++ (std), unde sunt declarate toate clasele, metodele și șabloanele. Prin urmare, în timp ce scriem un program C++, de obicei includem directiva
folosind namespace std;

spațiu de nume în C++ | Setul 2 (Extinderea spațiului de nume și spațiul de nume fără nume) Spațiul de nume în C++ | Setul 3 (Accesarea, crearea antetului, imbricarea și aliasarea) Pot fi imbricate spațiile de nume în C++? Referinţă : http://www.cplusplus.com/doc/tutorial/namespaces/