- Namespace giver det rum, hvor vi kan definere eller erklære identifikator, dvs. variabel, metode, klasser.
- Ved hjælp af navneområde kan du definere det rum eller den kontekst, hvori identifikatorer defineres, dvs. variable, metode, klasser. I bund og grund definerer et navneområde et omfang.
Fordel ved Namespace for at undgå navnekollision.
- Eksempelvis skriver du måske en kode, der har en funktion kaldet xyz(), og der er et andet bibliotek tilgængeligt, som også har samme funktion xyz(). Nu har compileren ingen mulighed for at vide, hvilken version af xyz()-funktionen du henviser til i din kode.
- Et navneområde er designet til at overvinde denne vanskelighed og bruges som yderligere information til at differentiere lignende funktioner, klasser, variabler osv. med det samme navn tilgængeligt i forskellige biblioteker.
- Det bedste eksempel på navnerumsomfang er C++ standardbiblioteket (std), hvor alle klasser, metoder og skabeloner er erklæret. Når vi skriver et C++-program, inkluderer vi derfor normalt direktivet ved hjælp af navneområde std;
Definition af et navneområde:
- En navneområdedefinition begynder med nøgleordet navneområde efterfulgt af navneområdenavnet som følger:
namespace namespace_name { // code declarations i.e. variable (int a;) method (void add();) classes ( class student{};) }> - Det skal bemærkes, at der ikke er noget semikolon (;) efter den afsluttende klammeparentes.
- For at kalde den navneområdeaktiverede version af enten funktion eller variabel skal du indsætte navnerummets navn som følger:
- navneområde_navn: :kode; // kode kan være variabel , funktion eller klasse.
Brugsdirektivet:
- Du kan også undgå at foranstille navneområder med direktivet om at bruge navneområde. Dette direktiv fortæller compileren, at den efterfølgende kode gør brug af navne i det angivne navneområde.
- Navnerummet er således underforstået for følgende kode:
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;> }> |
>
>Produktion
Inside first_space>
- Navne, der er indført i et brugsdirektiv, overholder reglerne for det normale anvendelsesområde. Navnet er synligt fra punktet af brugsdirektivet til slutningen af det anvendelsesområde, hvori direktivet findes. Enheder med samme navn defineret i et ydre omfang er skjult.
Indlejrede navnerum:
- Navneområder kan indlejres, hvor du kan definere ét navneområde inde i et andet navnerum som følger:
SYNTAX: namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }> Du kan få adgang til medlemmer af indlejret navneområde ved at bruge opløsningsoperatorer som følger:
// for at få adgang til medlemmer af namespace_name2
ved at bruge navneområde navneområde_navn1::navneområde_navn2;
// for at få adgang til medlemmer af namespace_name1
ved hjælp af navneområde navneområde_navn1;
I ovenstående udsagn, hvis du bruger navneområde_navn1, vil det gøre elementer af navneområde_navn2 tilgængelige i omfanget som følger:
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>
Lad os se, hvordan navneområdet omfatter entiteterne, herunder variable og 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>
Overvej følgende C++-program:
CPP
// A program to demonstrate need of namespace> int> main()> {> >int> value;> >value = 0;> >double> value;>// Error here> >value = 0.0;> }> |
>
>
Output:
Compiler Error: 'value' has a previous declaration as 'int value'>
I hvert omfang kan et navn kun repræsentere én enhed. Så der kan ikke være to variable med samme navn i samme omfang. Ved at bruge navneområder kan vi oprette to variable eller medlemsfunktioner med samme navn.
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 og skabelse: Navneområder giver os mulighed for at gruppere navngivne enheder, som ellers ville have globalt omfang ind i snævrere rammer, hvilket giver dem navneområdets omfang . Dette gør det muligt at organisere programmernes elementer i forskellige logiske områder, der henvises til med navne. Navneområder giver plads, hvor vi kan definere eller erklære identifikatorer, dvs. navne på variabler, metoder, klasser osv.
- Et navneområde er en funktion tilføjet i C++ og er ikke til stede i C.
- Et navneområde er en deklarativ region, der giver et omfang til identifikatorerne (navne på funktioner, variabler eller andre brugerdefinerede datatyper) inde i det.
- Flere navnerumsblokke med samme navn er tilladt. Alle erklæringer inden for disse blokke er deklareret i det navngivne omfang.
En navnerumsdefinition begynder med nøgleordet navneområde efterfulgt af navnerummets navn som følger:
namespace namespace_name { int x, y; // code declarations where // x and y are declared in // namespace_name's scope }> - Navneområdeerklæringer vises kun i globalt omfang.
- Navneområdeerklæringer kan indlejres i et andet navneområde.
- Navneområdeerklæringer har ikke adgangsspecifikationer (offentlig eller privat).
- Det er ikke nødvendigt at angive et semikolon efter den afsluttende klammeparentes i definitionen af navneområde.
- Vi kan opdele definitionen af navneområde over flere enheder.
Definition af et navneområde:
En navneområdedefinition begynder med nøgleordet navneområde efterfulgt af navneområdenavnet som følger:
kat timpf søster
C++
namespace> namespace_name{> >// code declarations i.e. variable (int a;)> >method (>void> add();)> >classes (>class> student{};)> }> |
>
>
Det skal bemærkes, at der ikke er et semikolon (;) efter den afsluttende klammeparentes.
For at kalde den navneområdeaktiverede version af enten en funktion eller en variabel skal du sætte navneområdet foran som følger:
navneområde_navn: :kode; // kode kan være en variabel, funktion eller klasse.
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>
Brugsdirektivet:
Du kan undgå at foranstille navneområder med direktivet om at bruge navneområde. Dette direktiv fortæller compileren, at den efterfølgende kode gør brug af navne i det angivne navneområde. Navnerummet er således underforstået for følgende kode:
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> |
>
>
ændre fil linuxProduktion
Inside first_space>
I stedet for at få adgang til hele navneområdet, kan en anden mulighed (kendt som ved brug af erklæring) er at få adgang til et bestemt element i et navneområde. For eksempel, hvis den eneste del af std-navneområdet, som du har til hensigt at bruge, er cout, kan du henvise til det som følger:
bruger std::cout;
Efterfølgende kode kan referere til cout uden at forudsætte navneområdet, men andre elementer i standardnavneområdet skal stadig være eksplicitte som følger:
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!>
Navne, der indføres i et brugsdirektiv, overholder normale regler for anvendelsesområde, dvs. de er synlige fra det tidspunkt, hvor brugsdirektivet opstår, til slutningen af det anvendelsesområde, hvori direktivet findes. Enheder med det samme navn defineret i et ydre omfang er skjult.
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;> }> |
>
>
Produktion:
5 200 100>
Klasser og navneområde: Følgende er en enkel måde at oprette klasser i et navneområ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 klasse kan også erklæres inde i navneområdet og defineres uden for navneområdet ved hjælp af følgende syntaks:
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 også definere metoder uden for navneområdet . Følgende er en eksempelkode:
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():>
Indlejrede navnerum:
Navneområder kan indlejres, dvs. du kan definere ét navneområde inde i et andet navneområde som følger:
C++
alfabet og tal
namespace> namespace_name1 {> >// code declarations> >namespace> namespace_name2 {> >// code declarations> >}> }> |
>
>
Du kan få adgang til medlemmerne af et indlejret navneområde ved at bruge opløsningsoperatoren (::) som følger:
C++
// to access members of namespace_name2> using> namespace> namespace_name1::namespace_name2;> // to access members of namespace:name1> using> namespace> namespace_name1;> |
>
>
I ovenstående udsagn, hvis du bruger navneområde_navn1, vil det gøre elementerne i navneområde_navn2 tilgængelige i omfanget som følger:
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> |
>
>Produktion
Inside second_space>
Navneområde giver fordelen ved at undgå navnekollision:-
For eksempel kan du skrive en kode, der har en funktion kaldet xyz(), og der er et andet bibliotek tilgængeligt i din kode, som også har den samme funktion xyz(). Nu har compileren ingen mulighed for at vide, hvilken version af xyz()-funktionen du henviser til i din kode.
Et navneområde er designet til at overvinde denne vanskelighed og bruges som yderligere information til at differentiere lignende funktioner, klasser, variabler osv. med det samme navn tilgængeligt i forskellige biblioteker.
Det bedste eksempel på navnerumsomfang er C++ standardbiblioteket (std), hvor alle klasser, metoder og skabeloner er deklareret. Derfor inkluderer vi normalt direktivet, mens vi skriver et C++-program
bruger navneområde std;
navneområde i C++ | Sæt 2 (Udvidelse af navneområde og navneområde med navn) Navneområde i C++ | Sæt 3 (Adgang, oprettelse af header, indlejring og aliasing) Kan navnerum indlejres i C++? Reference : http://www.cplusplus.com/doc/tutorial/namespaces/