logo

Jmenný prostor v C++ | Sada 1 (úvod)

  • Namespace poskytuje prostor, kde můžeme definovat nebo deklarovat identifikátor, tedy proměnnou, metodu, třídy.
  • Pomocí jmenného prostoru můžete definovat prostor nebo kontext, ve kterém jsou definovány identifikátory, tj. proměnná, metoda, třídy. V podstatě jmenný prostor definuje rozsah.

Výhoda jmenného prostoru, aby se zabránilo kolizi jmen.

  • Například můžete psát nějaký kód, který má funkci nazvanou xyz() a je k dispozici další knihovna, která má také stejnou funkci xyz(). Kompilátor nyní nemá žádný způsob, jak zjistit, na kterou verzi funkce xyz() v kódu odkazujete.
  • Jmenný prostor je navržen tak, aby tento problém překonal a používá se jako doplňková informace k rozlišení podobných funkcí, tříd, proměnných atd. se stejným názvem dostupným v různých knihovnách.
  • Nejlepším příkladem oboru názvů je standardní knihovna C++ (std), kde jsou deklarovány všechny třídy, metody a šablony. Proto při psaní programu v C++ obvykle zahrneme direktivu pomocí jmenného prostoru std;

Definování jmenného prostoru:

  • Definice jmenného prostoru začíná jmenným prostorem klíčových slov, za kterým následuje název jmenného prostoru takto:
namespace namespace_name { // code declarations i.e. variable (int a;) method (void add();) classes ( class student{};) }>
  • Je třeba poznamenat, že za uzavírací složenou závorkou není žádný středník (;).
  • Chcete-li volat verzi funkce nebo proměnné s povoleným jmenným prostorem, přidejte před název jmenného prostoru následujícím způsobem:
  • jmenný_prostor: :kód; // kód může být proměnná , funkce nebo třída.

Direktiva použití:

  • Můžete se také vyhnout předřazení jmenných prostorů pomocí direktivy using namespace. Tato direktiva říká kompilátoru, že následný kód používá jména v určeném jmenném prostoru.
  • Jmenný prostor je tedy implikován pro následující 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ýstup

Inside first_space>
  • Názvy zavedené v pomocí direktivy se řídí běžnými pravidly rozsahu. Název je viditelný od bodu použití směrnice až po konec rozsahu, ve kterém se směrnice nachází. Entity se stejným názvem definovaným ve vnějším oboru jsou skryté.

Vnořené jmenné prostory:

  • Jmenné prostory lze vnořit, kde můžete definovat jeden jmenný prostor uvnitř jiného jmenného prostoru následovně:
SYNTAX: namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }>

K členům vnořeného oboru názvů můžete přistupovat pomocí operátorů rozlišení takto:
// pro přístup k členům jmenného_prostoru2
pomocí jmenného prostoru jmenný_prostor1::jméno_prostoru2;
// pro přístup k členům jmenného_prostoru1
pomocí jmenného prostoru jmenný_prostor1;

Pokud ve výše uvedených příkazech používáte namespace_name1, zpřístupní prvky namespace_name2 v rozsahu následovně:

C++


co je export v linuxu



#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ýstup

Inside second_space>

Podívejme se, jak jmenný prostor zahrnuje entity včetně proměnných a funkcí:

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ýstup

Inside first_space Inside second_space>

Zvažte následující program C++:

CPP




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

výjimka java throw

>

>

Výstup :

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

V každém oboru může název představovat pouze jednu entitu. Ve stejném rozsahu tedy nemohou existovat dvě proměnné se stejným názvem. Pomocí jmenných prostorů můžeme vytvořit dvě proměnné nebo členské funkce se stejným názvem.

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

>

>

Výstup

500>

Definice a tvorba: Jmenné prostory nám umožňují seskupovat pojmenované entity, které by jinak byly globální působnost do užších oborů, dávat je rozsah jmenného prostoru . To umožňuje organizovat prvky programů do různých logických oborů, na které se odkazují názvy. Jmenné prostory poskytují prostor, kde můžeme definovat nebo deklarovat identifikátory, tj. názvy proměnných, metod, tříd atd.

  • Jmenný prostor je funkce přidaná v C++ a není přítomna v C.
  • Jmenný prostor je deklarativní oblast, která poskytuje rozsah pro identifikátory (názvy funkcí, proměnných nebo jiné uživatelem definované datové typy) uvnitř.
  • Je povoleno více bloků jmenného prostoru se stejným názvem. Všechny deklarace v těchto blocích jsou deklarovány v pojmenovaném rozsahu.

Definice jmenného prostoru začíná klíčovým slovem jmenný prostor následovaný názvem jmenného prostoru takto:

namespace namespace_name { int x, y; // code declarations where // x and y are declared in // namespace_name's scope }>
  • Deklarace jmenného prostoru se objevují pouze v globálním rozsahu.
  • Deklarace jmenného prostoru mohou být vnořeny do jiného jmenného prostoru.
  • Deklarace jmenného prostoru nemají specifikátory přístupu (Public nebo Private).
  • Není třeba dávat středník za uzavírací závorkou definice jmenného prostoru.
  • Definici jmenného prostoru můžeme rozdělit na několik jednotek.

Definování jmenného prostoru:

Definice jmenného prostoru začíná jmenným prostorem klíčových slov, za kterým následuje název jmenného prostoru takto:

C++




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

>

>

Je třeba poznamenat, že za uzavírací složenou závorkou není žádný středník (;).
Chcete-li volat verzi funkce nebo proměnné s povoleným jmenným prostorem, přidejte před název jmenného prostoru následovně:

jmenný_prostor: :kód; // kód může být proměnná, funkce nebo třída.

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ýstup

Inside first_space Inside second_space>

Direktiva použití:

Pomocí direktivy using namespace se můžete vyhnout předřazení jmenných prostorů. Tato direktiva říká kompilátoru, že následný kód používá jména v určeném jmenném prostoru. Jmenný prostor je tedy implikován pro následující 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ýstup

Inside first_space>

Místo přístupu k celému jmennému prostoru je k dispozici další možnost (známá jako použitím deklarace) je přístup k určité položce v rámci jmenného prostoru. Pokud například jedinou částí jmenného prostoru std, kterou chcete použít, je cout, můžete se na ni odkázat následovně:
pomocí std::cout;
Následující kód může odkazovat na cout bez předřazení jmenného prostoru, ale ostatní položky ve jmenném prostoru std budou muset být explicitní následovně:

C++




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

>

>

Výstup

std::endl is used with std!>

Názvy zavedené ve směrnici o použití se řídí běžnými pravidly rozsahu, tj. jsou viditelné od bodu, kdy se směrnice o použití nachází, až po konec rozsahu, ve kterém se směrnice nachází. Entity se stejným názvem definovaným ve vnějším oboru jsou skryté.

C++


abeceda a čísla



// 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ýstup:

5 200 100>

Třídy a jmenný prostor: Následuje jednoduchý způsob, jak vytvořit třídy ve jmenném prostoru:

C++




analýza řetězce na int

// 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ýstup

ns::geek::display()>

Třídu lze také deklarovat uvnitř jmenného prostoru a definovat mimo jmenný prostor pomocí následující 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ýstup

ns::geek::display()>

Metody můžeme definovat i mimo jmenný prostor . Následuje pří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ýstup:

ns::display() ns::geek::display():>

Vnořené jmenné prostory:

Jmenné prostory mohou být vnořené, tj. můžete definovat jeden jmenný prostor uvnitř jiného jmenného prostoru následovně:

C++




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

>

>

K členům vnořeného jmenného prostoru můžete přistupovat pomocí operátoru rozlišení (::) takto:

C++




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

>

>

Pokud ve výše uvedených příkazech používáte namespace_name1, pak budou prvky namespace_name2 dostupné v rozsahu následovně:

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>

>

>

jquery toto kliknutí
Výstup

Inside second_space>

Jmenný prostor poskytuje tu výhodu, že se vyhnete kolizi jmen: -

Například můžete psát nějaký kód, který má funkci nazvanou xyz() a ve vašem kódu je dostupná další knihovna, která má také stejnou funkci xyz(). Kompilátor nyní nemá žádný způsob, jak zjistit, na kterou verzi funkce xyz() v kódu odkazujete.
Jmenný prostor je navržen tak, aby tento problém překonal a používá se jako doplňková informace k rozlišení podobných funkcí, tříd, proměnných atd. se stejným názvem dostupným v různých knihovnách.
Nejlepším příkladem rozsahu jmenného prostoru je standardní knihovna C++ (std), kde jsou deklarovány všechny třídy, metody a šablony. Proto při psaní programu v C++ obvykle zahrneme direktivu
pomocí jmenného prostoru std;

jmenný prostor v C++ | Sada 2 (rozšíření jmenného prostoru a nepojmenovaný jmenný prostor) Jmenný prostor v C++ | Sada 3 (Přístup, vytváření záhlaví, vnořování a aliasing) Lze jmenné prostory vnořit v C++? Odkaz : http://www.cplusplus.com/doc/tutorial/namespaces/