- Menný priestor poskytuje priestor, kde môžeme definovať alebo deklarovať identifikátor, teda premennú, metódu, triedy.
- Pomocou priestoru názvov môžete definovať priestor alebo kontext, v ktorom sú definované identifikátory, t. j. premenná, metóda, triedy. Menný priestor v podstate definuje rozsah.
Výhoda priestoru názvov, aby sa zabránilo kolízii mien.
- Napríklad, môžete písať nejaký kód, ktorý má funkciu s názvom xyz() a je dostupná iná knižnica, ktorá má tiež rovnakú funkciu xyz(). Teraz kompilátor nemá žiadny spôsob, ako zistiť, na ktorú verziu funkcie xyz() vo svojom kóde odkazujete.
- Menný priestor je navrhnutý tak, aby prekonal tento problém a používa sa ako doplnková informácia na rozlíšenie podobných funkcií, tried, premenných atď. s rovnakým názvom dostupným v rôznych knižniciach.
- Najlepším príkladom rozsahu názvov je štandardná knižnica C++ (std), kde sú deklarované všetky triedy, metódy a šablóny. Preto pri písaní programu v C++ zvyčajne zahrnieme smernicu pomocou priestoru názvov std;
Definovanie priestoru názvov:
- Definícia priestoru názvov začína priestorom názvov kľúčových slov, za ktorým nasleduje názov priestoru názvov takto:
namespace namespace_name { // code declarations i.e. variable (int a;) method (void add();) classes ( class student{};) }> - Treba poznamenať, že za uzatváracou zátvorkou nie je bodkočiarka (;).
- Ak chcete zavolať verziu funkcie alebo premennej s povoleným priestorom názvov, pridajte pred názov priestoru názvov nasledovne:
- namespace_name: :code; // kód môže byť premenná, funkcia alebo trieda.
Smernica o používaní:
- Môžete sa tiež vyhnúť predradeniu menných priestorov pomocou direktívy using namespace. Táto direktíva hovorí kompilátoru, že nasledujúci kód používa mená v zadanom priestore názvov.
- Menný priestor je teda implikovaný pre nasledujúci kód:
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;> }> |
>
>Výkon
Inside first_space>
- Názvy zavedené v smernici o používaní sa riadia pravidlami normálneho rozsahu. Názov je viditeľný od bodu použitia smernice až po koniec rozsahu, v ktorom sa smernica nachádza. Entity s rovnakým názvom definovaným vo vonkajšom rozsahu sú skryté.
Vnorené priestory názvov:
- Priestory názvov môžu byť vnorené, kde môžete definovať jeden priestor názvov v rámci iného priestoru názvov takto:
SYNTAX: namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }> K členom vnoreného priestoru názvov môžete pristupovať pomocou operátorov rozlíšenia takto:
// na prístup k členom namespace_name2
pomocou menného priestoru namespace_name1::namespace_name2;
// na prístup k členom namespace_name1
pomocou menného priestoru namespace_name1;
Ak vo vyššie uvedených príkazoch používate namespace_name1, potom budú prvky namespace_name2 dostupné v rozsahu takto:
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;> }> |
>
>Výkon
Inside second_space>
Pozrime sa, ako menný priestor zahŕňa entity vrátane premenných a funkcií:
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;> }> |
>
>Výkon
Inside first_space Inside second_space>
Zvážte nasledujúci program C++:
CPP
// A program to demonstrate need of namespace> int> main()> {> >int> value;> >value = 0;> >double> value;>// Error here> >value = 0.0;> }> |
>
>
Výkon :
Compiler Error: 'value' has a previous declaration as 'int value'>
V každom rozsahu môže názov reprezentovať iba jednu entitu. Takže nemôžu existovať dve premenné s rovnakým názvom v rovnakom rozsahu. Pomocou menných priestorov môžeme vytvoriť dve premenné alebo členské funkcie s rovnakým názvom.
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;> }> |
>
osi referenčný model v sieťovaní
>Výkon
500>
Definícia a tvorba: Menné priestory nám umožňujú zoskupovať pomenované entity, ktoré by inak boli globálny rozsah do užších rozsahov, dávajúc im rozsah menného priestoru . To umožňuje organizovať prvky programov do rôznych logických rozsahov označovaných názvami. Priestory názvov poskytujú priestor, kde môžeme definovať alebo deklarovať identifikátory, teda názvy premenných, metód, tried atď.
- Menný priestor je funkcia pridaná v C++ a nie je prítomná v C.
- Priestor názvov je deklaratívna oblasť, ktorá poskytuje rozsah identifikátorov (názvov funkcií, premenných alebo iných typov údajov definovaných používateľom) vo vnútri.
- Je povolených viacero blokov menného priestoru s rovnakým názvom. Všetky deklarácie v rámci týchto blokov sú deklarované v pomenovanom rozsahu.
Definícia menného priestoru začína kľúčovým slovom menný priestor nasleduje názov priestoru názvov takto:
namespace namespace_name { int x, y; // code declarations where // x and y are declared in // namespace_name's scope }> - Deklarácie menného priestoru sa zobrazujú iba v globálnom rozsahu.
- Deklarácie menného priestoru môžu byť vnorené do iného menného priestoru.
- Deklarácie priestoru názvov nemajú špecifikátory prístupu (verejné alebo súkromné).
- Nie je potrebné dávať bodkočiarku za uzatváraciu zátvorku definície menného priestoru.
- Definíciu menného priestoru môžeme rozdeliť na niekoľko jednotiek.
Definovanie priestoru názvov:
Definícia priestoru názvov začína priestorom názvov kľúčových slov, za ktorým nasleduje názov priestoru názvov takto:
C++
namespace> namespace_name{> >// code declarations i.e. variable (int a;)> >method (>void> add();)> >classes (>class> student{};)> }> |
>
>
Treba poznamenať, že za uzatváracou zátvorkou nie je bodkočiarka (;).
Ak chcete zavolať verziu funkcie alebo premennej s povoleným priestorom názvov, pridajte pred názov priestoru názvov nasledovne:
namespace_name: :code; // kód môže byť premenná, funkcia alebo trieda.
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> |
>
>Výkon
Inside first_space Inside second_space>
Smernica o používaní:
Pomocou direktívy using namespace sa môžete vyhnúť pripájaniu menných priestorov. Táto direktíva hovorí kompilátoru, že nasledujúci kód používa mená v zadanom priestore názvov. Menný priestor je teda implikovaný pre nasledujúci kód:
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> |
>
>Výkon
Inside first_space>
Namiesto prístupu k celému mennému priestoru existuje ďalšia možnosť (známa ako použitím deklarácia) je prístup k určitej položke v rámci menného priestoru. Napríklad, ak jedinou časťou menného priestoru std, ktorú chcete použiť, je cout, môžete sa na ňu odvolať takto:
pomocou std::cout;
Následný kód môže odkazovať na cout bez pridania priestoru názvov, ale ostatné položky v priestore názvov std budú musieť byť explicitné takto:
C++
#include> using> std::cout;> int> main ()> {> >cout <<>'std::endl is used with std!'> << std::endl;> >return> 0;> }> |
>
>Výkon
std::endl is used with std!>
Názvy zavedené v smernici o používaní sa riadia pravidlami normálneho rozsahu, t. j. sú viditeľné od bodu, v ktorom sa smernica o používaní nachádza, až po koniec rozsahu, v ktorom sa smernica nachádza. Entity s rovnakým názvom definovaným vo vonkajšom rozsahu sú skryté.
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;> }> |
>
>
Výkon:
5 200 100>
Triedy a priestor názvov: Nasleduje jednoduchý spôsob, ako vytvoriť triedy v mennom priestore:
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; }> |
>
>Výkon
ns::geek::display()>
Trieda môže byť tiež deklarovaná vo vnútri menného priestoru a definovaná mimo menného priestoru pomocou nasledujúcej syntaxe:
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;> }> |
>
>Výkon
ns::geek::display()>
Metódy môžeme definovať aj mimo menného priestoru . Nasleduje príklad kódu:
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;> }> |
>
>
Výkon:
ns::display() ns::geek::display():>
Vnorené priestory názvov:
Priestory názvov môžu byť vnorené, t. j. jeden priestor názvov môžete definovať v rámci iného priestoru názvov takto:
C++
namespace> namespace_name1 {> >// code declarations> >namespace> namespace_name2 {> >// code declarations> >}> }> |
>
>
K členom vnoreného priestoru názvov môžete pristupovať pomocou operátora rozlíšenia (::) takto:
C++
// to access members of namespace_name2> using> namespace> namespace_name1::namespace_name2;> // to access members of namespace:name1> using> namespace> namespace_name1;> |
>
>
Ak vo vyššie uvedených príkazoch používate názov_priestoru_názvov1, prvky názvu_priestoru_názvov2 budú dostupné v rozsahu takto:
C++
ctc úplná forma
#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> |
>
>Výkon
Inside second_space>
Priestor názvov poskytuje výhodu vyhýbania sa kolízii mien: -
Môžete napríklad písať nejaký kód, ktorý má funkciu s názvom xyz() a vo vašom kóde je dostupná iná knižnica, ktorá má tiež rovnakú funkciu xyz(). Teraz kompilátor nemá žiadny spôsob, ako zistiť, na ktorú verziu funkcie xyz() vo svojom kóde odkazujete.
Menný priestor je navrhnutý tak, aby prekonal tento problém a používa sa ako doplnková informácia na odlíšenie podobných funkcií, tried, premenných atď. s rovnakým názvom dostupným v rôznych knižniciach.
Najlepším príkladom rozsahu názvov je štandardná knižnica C++ (std), kde sú deklarované všetky triedy, metódy a šablóny. Preto pri písaní programu v C++ zvyčajne zahrnieme smernicu
pomocou menného priestoru std;
menný priestor v C++ | Sada 2 (Rozšírenie priestoru názvov a Nemenovaný priestor názvov) Priestor názvov v C++ | Sada 3 (Prístup, vytváranie hlavičky, vnorenie a aliasing) Môžu byť menné priestory vnorené v C++? Odkaz : http://www.cplusplus.com/doc/tutorial/namespaces/