- Imenski prostor zagotavlja prostor, kjer lahko definiramo ali deklariramo identifikator, tj. spremenljivko, metodo, razrede.
- Z uporabo imenskega prostora lahko definirate prostor ali kontekst, v katerem so definirani identifikatorji, tj. spremenljivka, metoda, razredi. V bistvu imenski prostor definira obseg.
Prednost imenskega prostora za izogibanje koliziji imen.
- Na primer, morda pišete kodo, ki ima funkcijo, imenovano xyz(), na voljo pa je še ena knjižnica, ki ima prav tako isto funkcijo xyz(). Zdaj prevajalnik ne more vedeti, na katero različico funkcije xyz() se sklicujete v svoji kodi.
- Imenski prostor je zasnovan za premagovanje te težave in se uporablja kot dodatna informacija za razlikovanje podobnih funkcij, razredov, spremenljivk itd. z istim imenom, ki je na voljo v različnih knjižnicah.
- Najboljši primer obsega imenskega prostora je standardna knjižnica C++ (std), kjer so deklarirani vsi razredi, metode in predloge. Zato med pisanjem programa C++ običajno vključimo direktivo z uporabo imenskega prostora std;
Definiranje imenskega prostora:
- Definicija imenskega prostora se začne s ključno besedo namespace, ki ji sledi ime imenskega prostora, kot sledi:
namespace namespace_name { // code declarations i.e. variable (int a;) method (void add();) classes ( class student{};) }> - Upoštevati je treba, da za zaklepajem ni podpičja (;).
- Če želite poklicati različico funkcije ali spremenljivke, ki podpira imenski prostor, pred ime imenskega prostora dodajte naslednje:
- ime_imenskega_prostora: :koda; // koda je lahko spremenljivka, funkcija ali razred.
Direktiva o uporabi:
- Prav tako se lahko izognete prednastavitvi imenskih prostorov z uporabo direktive namespace. Ta direktiva pove prevajalniku, da naslednja koda uporablja imena v podanem imenskem prostoru.
- Imenski prostor je torej impliciran za naslednjo kodo:
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;> }> |
>
>Izhod
Inside first_space>
- Imena, uvedena v direktivi o uporabi, upoštevajo običajna pravila obsega. Ime je vidno od točke using direktive do konca obsega, v katerem je direktiva. Entitete z istim imenom, definirane v zunanjem obsegu, so skrite.
Ugnezdeni imenski prostori:
- Imenski prostori so lahko ugnezdeni, kjer lahko definirate en imenski prostor znotraj drugega imenskega prostora, kot sledi:
SYNTAX: namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }> Do članov ugnezdenega imenskega prostora lahko dostopate z uporabo operatorjev ločljivosti, kot sledi:
// za dostop do članov namespace_name2
z uporabo imenskega prostora namespace_name1::namespace_name2;
// za dostop do članov namespace_name1
uporaba imenskega prostora namespace_name1;
Če v zgornjih izjavah uporabljate namespace_name1, bodo elementi namespace_name2 na voljo v obsegu, kot sledi:
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;> }> |
>
>Izhod
Inside second_space>
Poglejmo, kako obsega imenski prostor entitet, vključno s spremenljivko in funkcijami:
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;> }> |
>
>Izhod
Inside first_space Inside second_space>
Razmislite o naslednjem programu C++:
CPP
// A program to demonstrate need of namespace> int> main()> {> >int> value;> >value = 0;> >double> value;>// Error here> >value = 0.0;> }> |
>
>
Izhod:
Compiler Error: 'value' has a previous declaration as 'int value'>
V vsakem obsegu lahko ime predstavlja samo eno entiteto. Torej v istem obsegu ne moreta biti dve spremenljivki z istim imenom. Z uporabo imenskih prostorov lahko ustvarimo dve spremenljivki ali članski funkciji z enakim imenom.
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;> }> |
>
kako pretvoriti iz niza v int
>Izhod
500>
Opredelitev in ustvarjanje: Imenski prostori nam omogočajo združevanje poimenovanih entitet, ki bi jih sicer imeli globalni obseg v ožje okvire, ki jim obseg imenskega prostora . To omogoča organiziranje elementov programov v različne logične obsege, na katere se nanašajo imena. Imenski prostori zagotavljajo prostor, kjer lahko definiramo ali deklariramo identifikatorje, tj. imena spremenljivk, metod, razredov itd.
- Imenski prostor je funkcija, dodana v C++ in ni prisotna v C.
- Imenski prostor je deklarativno območje, ki zagotavlja obseg za identifikatorje (imena funkcij, spremenljivke ali druge uporabniško definirane tipe podatkov) v njem.
- Dovoljenih je več blokov imenskega prostora z istim imenom. Vse deklaracije v teh blokih so deklarirane v imenovanem obsegu.
Definicija imenskega prostora se začne s ključno besedo imenski prostor ki mu sledi ime imenskega prostora, kot sledi:
namespace namespace_name { int x, y; // code declarations where // x and y are declared in // namespace_name's scope }> - Deklaracije imenskega prostora se pojavijo samo v globalnem obsegu.
- Deklaracije imenskega prostora so lahko ugnezdene znotraj drugega imenskega prostora.
- Izjave imenskega prostora nimajo specifikatorjev dostopa (javnega ali zasebnega).
- Za zaključnim oklepajem definicije imenskega prostora ni treba dati podpičja.
- Definicijo imenskega prostora lahko razdelimo na več enot.
Definiranje imenskega prostora:
Definicija imenskega prostora se začne s ključno besedo namespace, ki ji sledi ime imenskega prostora, kot sledi:
C++
namespace> namespace_name{> >// code declarations i.e. variable (int a;)> >method (>void> add();)> >classes (>class> student{};)> }> |
>
>
Upoštevati je treba, da za zaklepajem ni podpičja (;).
Če želite poklicati različico funkcije ali spremenljivke, ki podpira imenski prostor, pred ime imenskega prostora dodajte naslednje:
ime_imenskega_prostora: :koda; // koda je lahko spremenljivka, funkcija ali razred.
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> |
>
>Izhod
Inside first_space Inside second_space>
Direktiva o uporabi:
Dodajanju imenskih prostorov pred imenske prostore se lahko izognete z direktivo using namespace. Ta direktiva pove prevajalniku, da naslednja koda uporablja imena v podanem imenskem prostoru. Imenski prostor je torej impliciran za naslednjo kodo:
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> |
>
>Izhod
Inside first_space>
Namesto dostopa do celotnega imenskega prostora je druga možnost (znana kot uporabo deklaracija) je dostop do določenega elementa znotraj imenskega prostora. Na primer, če je edini del imenskega prostora std, ki ga nameravate uporabiti, cout, se lahko nanj sklicujete na naslednji način:
z uporabo std::cout;
Naslednja koda se lahko nanaša na cout, ne da bi dodala imenski prostor, vendar bodo drugi elementi v imenskem prostoru std še vedno morali biti eksplicitni, kot sledi:
C++
#include> using> std::cout;> int> main ()> {> >cout <<>'std::endl is used with std!'> << std::endl;> >return> 0;> }> |
>
>Izhod
std::endl is used with std!>
Imena, uvedena v direktivi using, upoštevajo običajna pravila obsega, tj. vidna so od točke, ko se direktiva using pojavi, do konca obsega, v katerem je direktiva najdena. Entitete z istim imenom, definirane v zunanjem obsegu, so skrite.
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;> }> |
>
>
Izhod:
5 200 100>
Razredi in imenski prostor: Sledi preprost način za ustvarjanje razredov v imenskem prostoru:
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; }> |
>
>Izhod
ns::geek::display()>
Razred je mogoče deklarirati tudi znotraj imenskega prostora in definirati zunaj imenskega prostora z naslednjo sintakso:
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;> }> |
>
>Izhod
ns::geek::display()>
Metode lahko definiramo tudi zunaj imenskega prostora . Sledi primer kode:
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;> }> |
>
>
Izhod:
ns::display() ns::geek::display():>
Ugnezdeni imenski prostori:
Imenski prostori so lahko ugnezdeni, kar pomeni, da lahko definirate en imenski prostor znotraj drugega imenskega prostora, kot sledi:
C++
namespace> namespace_name1 {> >// code declarations> >namespace> namespace_name2 {> >// code declarations> >}> }> |
>
>
Do članov ugnezdenega imenskega prostora lahko dostopate z uporabo operatorja resolucije (::), kot sledi:
C++
// to access members of namespace_name2> using> namespace> namespace_name1::namespace_name2;> // to access members of namespace:name1> using> namespace> namespace_name1;> |
>
>
Če v zgornjih izjavah uporabljate namespace_name1, bodo elementi namespace_name2 na voljo v obsegu, kot sledi:
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> |
>
>Izhod
Inside second_space>
Imenski prostor zagotavlja prednost izogibanja trčenju imen: -
Na primer, morda pišete kodo, ki ima funkcijo, imenovano xyz(), in v vaši kodi je na voljo druga knjižnica, ki ima prav tako isto funkcijo xyz(). Zdaj prevajalnik ne more vedeti, na katero različico funkcije xyz() se sklicujete v svoji kodi.
Imenski prostor je zasnovan za premagovanje te težave in se uporablja kot dodatna informacija za razlikovanje podobnih funkcij, razredov, spremenljivk itd. z istim imenom, ki je na voljo v različnih knjižnicah.
Najboljši primer obsega imenskega prostora je standardna knjižnica C++ (std), kjer so deklarirani vsi razredi, metode in predloge. Zato med pisanjem programa C++ običajno vključimo direktivo
uporaba imenskega prostora std;
imenski prostor v C++ | 2. sklop (Razširitev imenskega prostora in Neimenovani imenski prostor) Imenski prostor v C++ | 3. sklop (dostopanje, ustvarjanje glave, gnezdenje in vzdevek) Ali je mogoče imenske prostore ugnezditi v C++? Referenca : http://www.cplusplus.com/doc/tutorial/namespaces/