- Namnutrymme tillhandahåller utrymmet där vi kan definiera eller deklarera identifierare, dvs variabel, metod, klasser.
- Med hjälp av namnrymden kan du definiera utrymmet eller sammanhanget där identifierare definieras, dvs variabel, metod, klasser. I huvudsak definierar ett namnutrymme ett omfång.
Fördel med Namespace för att undvika namnkollision.
- Exempel, du kanske skriver någon kod som har en funktion som heter xyz() och det finns ett annat bibliotek tillgängligt som också har samma funktion xyz(). Nu har kompilatorn inget sätt att veta vilken version av xyz()-funktionen du hänvisar till i din kod.
- Ett namnområde är utformat för att övervinna denna svårighet och används som ytterligare information för att skilja liknande funktioner, klasser, variabler etc. med samma namn tillgängligt i olika bibliotek.
- Det bästa exemplet på namnområde är standardbiblioteket C++ (std) där alla klasser, metoder och mallar deklareras. Så när vi skriver ett C++-program inkluderar vi vanligtvis direktivet med namnutrymme std;
Definiera ett namnområde:
- En namnområdesdefinition börjar med nyckelordet namnområde följt av namnområdets namn enligt följande:
namespace namespace_name { // code declarations i.e. variable (int a;) method (void add();) classes ( class student{};) }> - Det bör noteras att det inte finns något semikolon (;) efter den avslutande klammerparentesen.
- För att anropa den namnområdesaktiverade versionen av antingen funktion eller variabel, lägg namnutrymmets namn före på följande sätt:
- namnområdesnamn: :kod; // koden kan vara variabel , funktion eller klass.
Användningsdirektivet:
- Du kan också undvika att föregå namnutrymmen med direktivet använder namnutrymme. Detta direktiv talar om för kompilatorn att den efterföljande koden använder namn i det angivna namnområdet.
- Namnutrymmet är alltså underförstått för följande kod:
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;> }> |
>
>
dator nätverkProduktion
Inside first_space>
- Namn som införts i ett användande direktiv följer normala räckviddsregler. Namnet är synligt från punkten för användningsdirektivet till slutet av omfattningen där direktivet finns. Entiteter med samma namn definierade i ett yttre omfång är dolda.
Kapslade namnområden:
- Namnutrymmen kan kapslas där du kan definiera ett namnområde i ett annat namnutrymme enligt följande:
SYNTAX: namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }> Du kan komma åt medlemmar av kapslade namnutrymmen genom att använda upplösningsoperatorer enligt följande:
// för att komma åt medlemmar av namespace_name2
använder namnområde namnområde_namn1::namnområde_namn2;
// för att komma åt medlemmar av namnområde_namn1
använder namnutrymmet namnområde_namn1;
I ovanstående uttalanden om du använder namnutrymme_namn1, kommer det att göra element av namnområde_namn2 tillgängliga i omfånget enligt följande:
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;> }> |
>
>Produktion
Inside second_space>
Låt oss se hur namnutrymmet omfattar enheterna inklusive variabel och funktioner:
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;> }> |
>
>Produktion
Inside first_space Inside second_space>
Tänk på följande C++-program:
CPP
// A program to demonstrate need of namespace> int> main()> {> >int> value;> >value = 0;> >double> value;>// Error here> >value = 0.0;> }> |
>
>
Utgång:
Compiler Error: 'value' has a previous declaration as 'int value'>
I varje omfattning kan ett namn endast representera en enhet. Så det kan inte finnas två variabler med samma namn i samma omfattning. Med hjälp av namnrymder kan vi skapa två variabler eller medlemsfunktioner med samma namn.
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;> }> |
>
>Produktion
500>
Definition och skapande: Namnutrymmen tillåter oss att gruppera namngivna enheter som annars skulle ha global räckvidd in i snävare omfattning, vilket ger dem namnutrymmets omfattning . Detta gör det möjligt att organisera elementen i programmen i olika logiska omfång som hänvisas till med namn. Namnutrymmen tillhandahåller utrymmet där vi kan definiera eller deklarera identifierare, dvs namn på variabler, metoder, klasser, etc.
- Ett namnområde är en funktion som läggs till i C++ och som inte finns i C.
- En namnrymd är en deklarativ region som ger en omfattning till identifierarna (namn på funktioner, variabler eller andra användardefinierade datatyper) inuti den.
- Flera namnområdesblock med samma namn är tillåtna. Alla deklarationer inom dessa block deklareras i det angivna omfånget.
En namnområdesdefinition börjar med nyckelordet namnutrymme följt av namnutrymmets namn enligt följande:
namespace namespace_name { int x, y; // code declarations where // x and y are declared in // namespace_name's scope }> - Namnområdesdeklarationer visas endast i globalt omfång.
- Namnområdesdeklarationer kan kapslas i ett annat namnområde.
- Namnområdesdeklarationer har inte åtkomstspecifikationer (offentliga eller privata).
- Inget behov av att ange semikolon efter den avslutande klammerparentesen i definitionen av namnutrymme.
- Vi kan dela definitionen av namnutrymme över flera enheter.
Definiera ett namnområde:
En namnområdesdefinition börjar med nyckelordet namnområde följt av namnområdets namn enligt följande:
C++
namespace> namespace_name{> >// code declarations i.e. variable (int a;)> >method (>void> add();)> >classes (>class> student{};)> }> |
slå samman sortering
>
>
Det bör noteras att det inte finns något semikolon (;) efter den avslutande klammerparentesen.
För att anropa den namnområdesaktiverade versionen av antingen en funktion eller en variabel, lägg namnutrymmets namn före på följande sätt:
namnområdesnamn: :kod; //-koden kan vara en variabel, funktion eller klass.
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> |
>
>Produktion
Inside first_space Inside second_space>
Användningsdirektivet:
Du kan undvika att föregå namnutrymmen med direktivet använda namnutrymme. Detta direktiv talar om för kompilatorn att den efterföljande koden använder namn i det angivna namnområdet. Namnutrymmet är alltså underförstått för följande kod:
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> |
>
>Produktion
Inside first_space>
Istället för att komma åt hela namnområdet, kan ett annat alternativ (känd som använder sig av deklaration) är att komma åt ett visst objekt inom ett namnområde. Till exempel, om den enda delen av std-namnutrymmet som du tänker använda är cout, kan du referera till det enligt följande:
använder std::cout;
Efterföljande kod kan referera till cout utan att föregå namnområdet, men andra objekt i standardnamnområdet måste fortfarande vara explicit enligt följande:
C++
#include> using> std::cout;> int> main ()> {> >cout <<>'std::endl is used with std!'> << std::endl;> >return> 0;> }> |
>
>Produktion
std::endl is used with std!>
Namn som introduceras i ett användningsdirektiv följer normala räckviddsregler, det vill säga de är synliga från den punkt då användningsdirektivet inträffar till slutet av räckvidden där direktivet finns. Entiteter med samma namn definierade i ett yttre omfång är dolda.
C++
alfabet och siffror
// 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;> }> |
>
>
arp-a kommando
Produktion:
5 200 100>
Klasser och namnutrymme: Följande är ett enkelt sätt att skapa klasser i ett namnområde:
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; }> |
>
>Produktion
ns::geek::display()>
En klass kan också deklareras inom namnområdet och definieras utanför namnområdet med följande syntax:
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;> }> |
>
>Produktion
ns::geek::display()>
Vi kan definiera metoder också utanför namnområdet . Följande är en exempelkod:
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;> }> |
>
>
Produktion:
ns::display() ns::geek::display():>
Kapslade namnområden:
Namnutrymmen kan kapslas, det vill säga du kan definiera ett namnområde i ett annat namnområde enligt följande:
C++
namespace> namespace_name1 {> >// code declarations> >namespace> namespace_name2 {> >// code declarations> >}> }> |
>
>
Du kan komma åt medlemmarna i ett kapslat namnområde genom att använda upplösningsoperatorn (::) enligt följande:
C++
// to access members of namespace_name2> using> namespace> namespace_name1::namespace_name2;> // to access members of namespace:name1> using> namespace> namespace_name1;> |
>
>
I ovanstående uttalanden, om du använder namnutrymme_namn1, kommer det att göra elementen i namnområdesnamn2 tillgängliga i omfånget enligt följande:
C++
vad är ymail
#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> |
>
>Produktion
Inside second_space>
Namnutrymme ger fördelen att undvika namnkollision:-
Till exempel kanske du skriver någon kod som har en funktion som heter xyz() och det finns ett annat bibliotek tillgängligt i din kod som också har samma funktion xyz(). Nu har kompilatorn inget sätt att veta vilken version av xyz()-funktionen du hänvisar till i din kod.
Ett namnområde är utformat för att övervinna denna svårighet och används som ytterligare information för att skilja liknande funktioner, klasser, variabler etc. med samma namn tillgängligt i olika bibliotek.
Det bästa exemplet på namnområde är standardbiblioteket C++ (std), där alla klasser, metoder och mallar deklareras. Därför inkluderar vi vanligtvis direktivet när vi skriver ett C++-program
använder namnutrymme std;
namnutrymme i C++ | Uppsättning 2 (Utöka namnutrymmet och Namnutrymmet) Namnutrymme i C++ | Uppsättning 3 (Åtkomst, skapa rubriker, kapsling och aliasing) Kan namnrymder kapslas i C++? Referens : http://www.cplusplus.com/doc/tutorial/namespaces/