logo

przestrzeń nazw w C++ | Zestaw 2 (rozszerzająca przestrzeń nazw i nienazwana przestrzeń nazw)

Wprowadziliśmy przestrzenie nazw w poniższym zestawie 1.
Przestrzeń nazw w C++ | Zestaw 1 (Wprowadzenie)

Definiowanie przestrzeni nazw:



Definicja przestrzeni nazw zaczyna się od słowa kluczowego namespace, po którym następuje nazwa przestrzeni nazw w następujący sposób:

przestrzeń nazw nazwa_przestrzeni nazw 
{
// deklaracje kodu, tj. zmienna  (int a;)
metoda (void add();)
zajęcia (uczeń klasy{};)
}

Należy zauważyć, że po nawiasie zamykającym nie ma średnika (;).
Aby wywołać wersję funkcji lub zmiennej z włączoną przestrzenią nazw, dodaj nazwę przestrzeni nazw na początku w następujący sposób:
nazwa_przestrzeni nazw: :kod;  // kod może być zmienną funkcją lub klasą.



Dyrektywa using:

Można także uniknąć dodawania przestrzeni nazw za pomocą dyrektywy using namespace. Ta dyrektywa informuje kompilator, że kolejny kod wykorzystuje nazwy z określonej przestrzeni nazw. 
Przestrzeń nazw jest zatem implikowana dla następującego kodu:

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; } 

Nazwy wprowadzone w dyrektywie using podlegają normalnym zasadom zakresu. Nazwa widoczna jest od miejsca dyrektywy using aż do końca zakresu, w którym dyrektywa się znajduje. Jednostki o tej samej nazwie zdefiniowane w zakresie zewnętrznym są ukryte.



Zagnieżdżone przestrzenie nazw:

Przestrzenie nazw można zagnieżdżać, umożliwiając zdefiniowanie jednej przestrzeni nazw w innej przestrzeni nazw w następujący sposób:

SYNTAX: namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }

Dostęp do członków zagnieżdżonej przestrzeni nazw można uzyskać za pomocą operatorów rozpoznawania w następujący sposób:
// aby uzyskać dostęp do członków przestrzeni nazw2
używając przestrzeni nazw nazwa_przestrzeni_nazw1::nazwa_przestrzeni_nazw2;
// aby uzyskać dostęp do członków przestrzeni nazw:nazwa1
używając przestrzeni nazw nazwa_przestrzeni_nazw1;


W powyższych instrukcjach, jeśli używasz nazwy przestrzeni nazw1, elementy przestrzeni nazw2 będą dostępne w następującym zakresie:

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; } 


Możliwe jest także utworzenie więcej niż jednej przestrzeni nazw w przestrzeni globalnej. Można to zrobić na dwa sposoby. 
 

    przestrzenie nazw o różnych nazwach 
     
CPP
// A C++ program to show more than one namespaces  // with different names. #include    using namespace std; // first name space namespace first {  int func() { return 5; } } // second name space namespace second {  int func() { return 10; } } int main() {  // member function of namespace  // accessed using scope resolution operator  cout &lt;&lt; first::func() &lt;&lt;&quot;n&quot;;   cout &lt;&lt; second::func() &lt;&lt;&quot;n&quot;;   return 0; } 

  • Wyjście: 
     
5 10
    Rozszerzanie przestrzeni nazw (dwukrotne użycie tej samej nazwy) 
    Możliwe jest również utworzenie dwóch bloków przestrzeni nazw o tej samej nazwie. Drugi blok przestrzeni nazw jest niczym innym jak kontynuacją pierwszej przestrzeni nazw. W prostszych słowach możemy powiedzieć, że obie przestrzenie nazw nie są różne, ale w rzeczywistości takie same, które są definiowane w częściach. 
     
CPP
// C++ program to demonstrate namespace extension #include    using namespace std; // first name space namespace first  {   int val1 = 500;  } // rest part of the first namespace namespace first  {   int val2 = 501;  } int main() {  cout &lt;&lt; first::val1 &lt;&lt;&quot;n&quot;;   cout &lt;&lt; first::val2 &lt;&lt;&quot;n&quot;;   return 0; } 

  • Wyjście: 
     
500 501


Nienazwane przestrzenie nazw  
 

  • Można ich bezpośrednio używać w tym samym programie i służą do deklarowania unikalnych identyfikatorów.
  • W nienazwanych przestrzeniach nazw nazwa przestrzeni nazw nie jest wymieniona w deklaracji przestrzeni nazw.
  • Nazwa przestrzeni nazw jest generowana jednoznacznie przez kompilator.
  • Utworzone przez Ciebie nienazwane przestrzenie nazw będą dostępne tylko w pliku, w którym je utworzyłeś.
  • Nienazwane przestrzenie nazw zastępują statyczną deklarację zmiennych.


 

CPP
// C++ program to demonstrate working of unnamed  // namespaces #include    using namespace std; // unnamed namespace declaration namespace  {  int rel = 300;  } int main() {  cout &lt;&lt; rel &lt;&lt; &quot;n&quot;; // prints 300  return 0; } 

Wyjście: 
 

300