Tenk på følgende to skalare uttalelser i et globalt omfang, i følgende program:
#inkludere
ved hjelp av navneområdet STD;
int varid = 5;
FLOAT VARID = 2.3;
int main ()
retur 0;
Et forsøk på å kompilere dette programmet fører til en kompilasjonsfeil. Det er to variabler med samme navn, varid. Selv om de er to forskjellige variabler av to forskjellige typer, int og flyte, Kompilatoren avviser de to erklæringene fordi de har samme navn. Følgende program løser dette problemet ved å erklære variablene med samme navn i to forskjellige generaliserte omfang:
#inkludere
ved hjelp av navneområdet STD;
Navneområde na
int varid = 5;
Navnområde NB
FLOAT VARID = 2.3;
int main ()
cout << NA::varId << '\n';
cout << NB::varId << '\n';
retur 0;
Utgangen er som følger:
5Det er to navnefelt i programmet ovenfor: Na, som har definisjonen av et heltall, og Nb, som har definisjonen av en flottør, men med samme navn som heltallet for NA. Til slutt, når programmet ble kjørt, ble samme navn for to forskjellige variabler brukt. Merk at for å få tilgang til samme navn på to forskjellige variabler, må det spesielle navnet på navneområdet brukes, etterfulgt av den vanlige identifikatoren. Navnområdet og den vanlige identifikatoren er atskilt av omfangsoppløsningsoperatøren, "::.”Navnet på navneområdene vil skille objektene.
Denne artikkelen dekker det grunnleggende konseptet med et navneområde og dets bruk i C ++ programmeringsspråket. For å følge denne artikkelen, bør du ha en grunnleggende kunnskap om C ++ -språket. Du bør også ha kunnskap om C ++ omfanget, selv om det kort er forklart i denne artikkelen. For å lære mer om C ++ omfang, søk etter uttrykket “Omfang i C ++” (uten sitater) i søkeboksen til en hvilken som helst Linuxhint.com webside og trykk enter. Dette vil føre deg til artikkelen denne forfatteren skrev.
Artikkelinnhold
Hva er et navneområde?
Et deklarativt område er den største delen av et program der navnet på en enhet (variabel) er gyldig. Denne regionen kalles et omfang. Et navneområde i C ++ er et generalisert omfang hvis hovedformål er å løse navnekonflikter. Et navneområde har grunnleggende erklæringer og/eller definisjoner av enheter.
Globalt navneområde og dets problem
Det globale navneområdet er det globale omfanget. Tenk på følgende korte program:
#inkludere
ved hjelp av navneområdet STD;
int identitet = 55;
FLOAT IDENT = 12.17;
int main ()
retur 0;
I programmet ovenfor er det to variabler, begge kalt ident. Disse variablene er i det globale omfanget; det vil si at de er i det globale navneområdet. Et forsøk på å kompilere dette programmet vil mislykkes med en feilmelding. Det globale omfanget godtar ikke mer enn en variabel med samme navn, så det er behov for et tilpasset navneområde.
Tilpasset navneområde
Et navneområde har ikke bare ett navn. I stedet har et navneområde et sett med navn for å unngå konflikt med andre sett med navn. For å unngå konflikt lavere i koden, kan du gå foran hvert navn med navnet på navneområdet og :: . Følgende program illustrerer dette ved hjelp av to tilpassede navnefelt:
#inkludere
ved hjelp av navneområdet STD;
Navneområde na
int varint = 6;
float flt;
Navnområde NB
int varint = 7;
float flt;
int main ()
cout << NA::varInt << '\n';
cout << NB::varInt << '\n';
Na :: flt = 2.5;
Nb :: flt = 4.8;
cout << NA::flt << '\n';
cout << NB::flt << '\n';
retur 0;
Utgangen er:
6Merk at navnene Na :: flt og Nb :: flt har til slutt blitt definert i hoved() funksjon. C ++ tillater ikke en slik definisjon i det globale omfanget.
Merk at det tilpassede navneområdet er et nestet navneområde for det globale navneområdet.
Brukerdirektivet
For å unngå å skrive “NamePace :: Navn” hele tiden i stedet for bare “Navn” etter å ha erklært navneområdet, kan du bruke ved hjelp av direktiv. Syntaksen for å bruke ved hjelp av Direktiv er som følger:
ved hjelp av navneområdet navneområdenavn;
De ved hjelp av Direktiv er ikke et forbehandlerdirektiv, så det ender med en semikolon (;).
Følgende program illustrerer bruken av ved hjelp av Direktiv og mer:
#inkludere
ved hjelp av navneområdet STD;
Navnområde NB
int varint = 7;
int func ()
returner varint;
int fn ()
ved hjelp av navneområde NB;
int myvar2 = func ();
// Andre objekter og funksjoner fra NB Følg.
returner Myvar2;
int myvar3 = nb :: func ();
int main ()
cout << fn() << " << myVar3 << '\n';
retur 0;
Utgangen til dette programmet er 7 7. Begrepet “ved hjelp av navneområde NB;”Har blitt plassert i begynnelsen av fn () definisjon. De func () Fra NB -navneområdet kalles rett under det, uten foregående med "Nb ::.”
En variabel erklært i det globale omfanget (globalt navneområde) sees fra erklæringspunktet til slutten av filen. Det sees også i de nestede navneområdene (nestede omfang), for eksempel nestet fn () funksjonsomfang ovenfor. De ved hjelp av Direktivet slutter seg til navneområdet fra stillingen som det er plassert til slutten av omfanget der det er plassert.
Navnet func () fra NB -navneområdet kan ikke sees under fn () Definisjon fordi "ved hjelp av navneområde nb; ” ble plassert innenfor funksjonsomfanget (blokkering). Under denne tilstanden, for å bruke “func ()”Utenfor NB -navneblokken (omfanget) må det gå inn av"Nb ::,”Som i følgende uttalelse:
int myvar3 = nb :: func ();
De ved hjelp av Direktivet slutter seg til navneområdet med det ytre hekkende navneområdet fra stillingen der det er plassert til enden av det ytre hekkende navneområdet. I det følgende programmet er NA -navneområdet sammen med det globale navneområdet. Begge navneområdene strekker seg deretter inn i fn () Funksjonsdefinisjonsnavnet, der de er sammen med NB -navneområdet. NB -navneområdet slutter på slutten av fn () Funksjonsdefinisjon, og de to foregående navneområdene fortsetter til slutten av filen (les gjennom koden).
#inkludere
ved hjelp av navneområdet STD;
Navneområde na
int varint = 6;
int func ()
returner varint;
Navnområde NB
int varint = 7;
int func ()
returner varint;
ved hjelp av navneområdet Na;
int myvar0 = varint;
// Andre objekter og funksjoner fra :: og NB Følg.
int fn ()
int myvar1 = varint;
ved hjelp av navneområde NB;
int myvar2 = nb :: func ();
// Andre objekter og funksjoner fra NB følger, til ende av dette omfanget.
Returner MyVar1 + MyVar2;
// Bare objekter og funksjoner fra :: og NB følg.
int myvar3 = nb :: func ();
int main ()
cout << myVar0 << " <<
fn () << " << myVar3 <<
'\ n';
retur 0;
Utgangen er 6, 13, 7.
Merk: Det globale navneområdet er indikert med :: , noe som betyr at det ikke er noe før operatøren for oppløsningsoppløsning som følger.
Under uttalelsen, "ved hjelp av navneområdet Na;”Variabler fra det globale og NA -navnefeltet kan brukes uten indikasjon på deres kilde -navneområde. Neste uttalelse bruker varint av NA -navneområdet. Det globale og NA kombinerte navneområdet strekker seg inn i fn () Funksjonsnavner. Så varint av den første uttalelsen i fn () funksjonsomfang, er av NA -navneområdet.
Siden regionen for de globale og NA -navneområdene strekker seg over hele fn () omfang, etter “int myvar2 = nb :: func ();,”Ethvert navn fra NB -navneområdet kan bare brukes i fn () omfang uten å gå foran det med “Nb ::,”Bare hvis det ikke skjedde i NA og globale navnefelt (blokker). Ellers bør det inngås av "Nb ::.”Regionen for de kombinerte navneområdene for NA og Global fortsetter under fn () Definisjon og inn i hoved() Funksjon til slutten av filen.
Utvidelsen av NB -navneområdet begynner fra “int myvar2 = nb :: func ();”I fn () blokkerer og ender på slutten av fn () Definisjonsblokk.
Merk: Navnområder hvis regioner er sammen, skal ikke ha samme variabelnavn i sine forskjellige navneområder, da dette fremdeles vil forårsake konflikt.
Navneområder regioner
Et navneområde er et omfang. Bortsett fra det globale navneområdet (globalt omfang), bør ethvert navneområde erklæres i en blokk. Den blokken er den første delen av de muligens distribuerte regionene i navneområdet. Med bruksdirektivet kan navneområdet utvides som regioner i andre omfang.
Enheter som er erklært i et navneområde, sies å være medlemmer av navneområdet, og navn som er introdusert av disse erklæringene i det deklarative området i navneområdet sies å være medlemsnavn på navneområdet.
Nestede navneområder
Følgende program viser nestede navneområder:
#inkludere
ved hjelp av navneområdet STD;
navneområde a
int i = 1;
namespace B
int i = 2;
namespace c
int i = 3;
int main ()
cout << A::i << " <<
A :: B :: I << " <<
A :: B :: C :: I << '\n';
retur 0;
Utgangen er:
1 2 3Legg merke til at de tre verdiene er tilgjengelig ved hjelp av Operatør for omfangsoppløsning.
Standard navneområde
C ++ har et bibliotek som heter Standard Library. Navnene på objekter, funksjoner og andre enheter i dette biblioteket er fra et navneområde kalt Standard Namespace, skrevet som std. Standardbiblioteket inneholder under-libraries, og en av disse under-librarene er iostream. De iostream Biblioteket inneholder objektet cout, som brukes til å sende resultater til konsollen (terminal).
Navnet cout må være i std navneområde. Å bruke iostream med dens std Navneområde, programmet skal være som følger:
#inkludereLegg merke til bruken av ved hjelp av direktiv og std. Begrepet “#inkludere ”Er et forbehandlerdirektiv og slutter ikke med en semikolon. Den inkluderer iostream "-filen" på dens direktiv.
Konklusjon
Et navneområde er et omfang. Navneområdet beskrivelse (definisjon) inneholder grunnleggende erklæringer og/eller definisjoner av C ++ objekter, funksjoner og andre enheter. Utenfor namespace -definisjonen kan du få tilgang til navnet med syntaks, "Namespacename :: Navn.”Bortsett fra det globale navneområdet (globalt omfang), bør ethvert navneområde erklæres i en blokk. Den blokken er den første delen av de muligens distribuerte regionene i navneområdet. Med ved hjelp av Direktivet kan navneområdet utvides som regioner i andre omfang. Navnområder hvis regioner er sammen, skal ikke ha samme variabelnavn i sine forskjellige navneområder, da dette fremdeles vil forårsake navnekonflikt.