- Navnerom gir plassen der vi kan definere eller deklarere identifikator, dvs. variabel, metode, klasser.
- Ved å bruke navneområde kan du definere rommet eller konteksten der identifikatorer er definert, dvs. variabel, metode, klasser. I hovedsak definerer et navneområde et omfang.
Fordel med Namespace for å unngå navnekollisjon.
- Eksempel, du kan skrive en kode som har en funksjon kalt xyz() og det er et annet bibliotek tilgjengelig som også har samme funksjon xyz(). Nå har kompilatoren ingen mulighet til å vite hvilken versjon av xyz()-funksjonen du refererer til i koden din.
- Et navneområde er utformet for å overvinne denne vanskeligheten og brukes som tilleggsinformasjon for å skille lignende funksjoner, klasser, variabler osv. med samme navn tilgjengelig i forskjellige biblioteker.
- Det beste eksemplet på navneromsomfang er C++ standardbiblioteket (std) der alle klassene, metodene og malene er deklarert. Derfor inkluderer vi vanligvis direktivet når vi skriver et C++-program ved å bruke navneområdet std;
Definere et navneområde:
- En navneromsdefinisjon begynner med nøkkelordet navnerom etterfulgt av navneromsnavnet som følger:
namespace namespace_name { // code declarations i.e. variable (int a;) method (void add();) classes ( class student{};) }> - Det skal bemerkes at det ikke er noe semikolon (;) etter den avsluttende klammeparentesen.
- For å kalle den navneområdeaktiverte versjonen av enten funksjon eller variabel, sett inn navneområdet foran på følgende måte:
- navneområde_navn: :kode; // kode kan være variabel , funksjon eller klasse.
Bruksdirektivet:
- Du kan også unngå prependering av navneområder med bruk av navneområde-direktivet. Dette direktivet forteller kompilatoren at den påfølgende koden bruker navn i det angitte navneområdet.
- Navnerommet er dermed underforstått 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;> }> |
>
>Produksjon
Inside first_space>
- Navn som er introdusert i et bruksdirektiv, følger vanlige regler for omfang. Navnet er synlig fra punktet av bruksdirektivet til slutten av omfanget der direktivet er funnet. Entiteter med samme navn definert i et ytre omfang er skjult.
Nestede navnerom:
- Navneområder kan nestes der du kan definere ett navneområde i et annet navneområde som følger:
SYNTAX: namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }> Du kan få tilgang til medlemmer av nestet navneområde ved å bruke oppløsningsoperatorer som følger:
// for å få tilgang til medlemmer av namespace_name2
ved å bruke navneområde navneområde_navn1::navnområde_navn2;
// for å få tilgang til medlemmer av namespace_name1
ved hjelp av navneområde navneområde_navn1;
I setningene ovenfor, hvis du bruker navneområde_navn1, vil det gjøre elementer av navnerom_navn2 tilgjengelige 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;> }> |
>
>Produksjon
Inside second_space>
La oss se hvordan navneområdet omfatter enhetene, inkludert variabel og funksjoner:
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;> }> |
>
>Produksjon
Inside first_space Inside second_space>
Tenk på 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;> }> |
>
>
Utgang:
Compiler Error: 'value' has a previous declaration as 'int value'>
I hvert omfang kan et navn bare representere én enhet. Så det kan ikke være to variabler med samme navn i samme omfang. Ved å bruke navneområder kan vi lage to variabler eller medlemsfunksjoner 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;> }> |
>
>Produksjon
500>
Definisjon og opprettelse: Navneområder lar oss gruppere navngitte enheter som ellers ville ha globalt omfang inn i smalere omfang, og gir dem navneområdets omfang . Dette gjør det mulig å organisere elementene i programmer i forskjellige logiske omfang referert til med navn. Navnerom gir plassen der vi kan definere eller deklarere identifikatorer, dvs. navn på variabler, metoder, klasser osv.
- Et navneområde er en funksjon lagt til i C++ og er ikke til stede i C.
- Et navneområde er en deklarativ region som gir et omfang til identifikatorene (navn på funksjoner, variabler eller andre brukerdefinerte datatyper) inne i den.
- Flere navneområdeblokker med samme navn er tillatt. Alle erklæringer innenfor disse blokkene er deklarert i det angitte omfanget.
En navneområdedefinisjon begynner med nøkkelordet navneområde etterfulgt av navneområdet 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 bare i globalt omfang.
- Navneområdedeklarasjoner kan nestes i et annet navneområde.
- Navneområdeerklæringer har ikke tilgangspesifikasjoner (offentlig eller privat).
- Det er ikke nødvendig å angi semikolon etter den avsluttende klammeparentesen i definisjonen av navneområde.
- Vi kan dele definisjonen av navneområde over flere enheter.
Definere et navneområde:
En navneromsdefinisjon begynner med nøkkelordet navnerom etterfulgt av navneromsnavnet 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 bemerkes at det ikke er noe semikolon (;) etter den avsluttende klammeparentesen.
For å kalle den navneområdeaktiverte versjonen av enten en funksjon eller en variabel, setter du navneområdet foran på følgende måte:
navneområde_navn: :kode; // kode kan være en variabel, funksjon 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> |
>
>Produksjon
Inside first_space Inside second_space>
Bruksdirektivet:
Du kan unngå prependering av navneområder med bruk av navneområde-direktivet. Dette direktivet forteller kompilatoren at den påfølgende koden bruker navn i det angitte navneområdet. Navnerommet er dermed underforstått 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> |
>
>
endre fil linuxProduksjon
Inside first_space>
I stedet for å få tilgang til hele navneområdet, kan et annet alternativ (kjent som ved hjelp av erklæring) er å få tilgang til et bestemt element i et navneområde. For eksempel, hvis den eneste delen av std-navneområdet du har tenkt å bruke er cout, kan du referere til det som følger:
bruker std::cout;
Påfølgende kode kan referere til cout uten å sette navnerommet foran, men andre elementer i standardnavneområdet må fortsatt være eksplisitte som følger:
C++
#include> using> std::cout;> int> main ()> {> >cout <<>'std::endl is used with std!'> << std::endl;> >return> 0;> }> |
>
>Produksjon
std::endl is used with std!>
Navn som er introdusert i et bruksdirektiv overholder vanlige regler for omfang, det vil si at de er synlige fra det tidspunktet bruksdirektivet inntreffer til slutten av omfanget der direktivet er funnet. Entiteter med samme navn definert i et ytre 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;> }> |
>
>
Produksjon:
5 200 100>
Klasser og navneområde: Følgende er en enkel måte å lage 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; }> |
>
>Produksjon
ns::geek::display()>
En klasse kan også deklareres innenfor navneområdet og defineres utenfor navneområdet ved å bruke 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;> }> |
>
>Produksjon
ns::geek::display()>
Vi kan definere metoder også utenfor 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;> }> |
>
>
Produksjon:
ns::display() ns::geek::display():>
Nestede navnerom:
Navneområder kan nestes, det vil si at du kan definere ett navneområde i et annet navneområde som følger:
C++
alfabet og tall
namespace> namespace_name1 {> >// code declarations> >namespace> namespace_name2 {> >// code declarations> >}> }> |
>
>
Du kan få tilgang til medlemmene av et nestet navneområde ved å bruke opplø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 setningene ovenfor, hvis du bruker navneområde_navn1, vil det gjøre elementene i navneområde_navn2 tilgjengelige 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> |
>
>Produksjon
Inside second_space>
Navneområde gir fordelen ved å unngå navnekollisjon:-
For eksempel kan du skrive en kode som har en funksjon kalt xyz() og det er et annet bibliotek tilgjengelig i koden din som også har samme funksjon xyz(). Nå har kompilatoren ingen mulighet til å vite hvilken versjon av xyz()-funksjonen du refererer til i koden din.
Et navneområde er utformet for å overvinne denne vanskeligheten og brukes som tilleggsinformasjon for å skille lignende funksjoner, klasser, variabler osv. med samme navn tilgjengelig i forskjellige biblioteker.
Det beste eksemplet på navneområdeomfang er C++ standardbiblioteket (std), der alle klassene, metodene og malene er deklarert. Derfor, mens vi skriver et C++-program, inkluderer vi vanligvis direktivet
bruker navneområde std;
navneområde i C++ | Sett 2 (Utvide navneområde og navneområde uten navn) Navneområde i C++ | Sett 3 (Tilgang, opprette overskrift, nesting og aliasing) Kan navneområder nestes i C++? Henvisning : http://www.cplusplus.com/doc/tutorial/namespaces/