C ++ navneområde

C Namespace



Et navneområde i C ++ er et generaliseret omfang. Dens erklæring begynder med det reserverede ord, navnerum, efterfulgt af et navn efter programmørens valg og derefter blokken i seler. Blokken indeholder grundlæggende deklarationer og/eller definitioner af C ++ - objekter, funktioner og andre enheder.

Overvej følgende to skalarudsagn i et globalt omfang i følgende program:







#omfatte
ved hjælp af navneområde std;

intvarId= 5;
flydevarId= 2.3;

intvigtigste()
{

Vend tilbage 0;
}

Et forsøg på at kompilere dette program fører til en kompilationsfejl. Der er to variabler med samme navn, varId . Selvom de er to forskellige variabler af to forskellige typer, int og flyde kompilatoren afviser de to erklæringer, fordi de har samme navn. Følgende program løser dette problem ved at deklarere variablerne med samme navn i to forskellige generaliserede omfang:



#omfatte
ved hjælp af navneområde std;

navnerum NA
{
intvarId= 5;
}

navnerum NB
{
flydevarId= 2.3;
}

intvigtigste()
{
koste<<NA::varId << ' n';
koste<<NB::varId << ' n';

Vend tilbage 0;
}

Outputtet er som følger:



5
2.3

Der er to navneområder i ovenstående program: NA , som har definitionen på et heltal, og NB , som har definitionen af ​​en float, men med samme navn som heltalet for NA. Endelig, da programmet blev kørt, blev det samme navn for to forskellige variabler brugt. Bemærk, at for at få adgang til det samme navn på to forskellige variabler, skal det særlige navn for navneområdet bruges, efterfulgt af den fælles identifikator. Navnepladsnavnet og den fælles identifikator adskilles af operatøren for omfangsopløsning, :: . Navnet på navneområderne vil differentiere objekterne.





Denne artikel dækker det grundlæggende koncept for et navnerum og dets anvendelse i programmeringssproget C ++. For at følge denne artikel skal du have en grundlæggende viden om C ++ - sproget. Du bør også have kendskab til C ++ - omfanget, selvom det kort forklares i denne artikel. Hvis du vil vide mere om C ++ - omfang, skal du søge efter sætningen, Omfang i C ++ (uden anførselstegn) i søgefeltet på enhver linuxhint.com -webside og trykke på Enter. Dette fører dig til den artikel, denne forfatter skrev.

Artikelindhold

Hvad er et navneområde?

En deklarativ region er den største del af et program, hvor navnet på en enhed (variabel) er gyldigt. Denne region kaldes et omfang. Et navnerum i C ++ er et generaliseret omfang, hvis hovedformål er at løse navnekonflikter. Et navnerum har grundlæggende erklæringer og/eller definitioner af enheder.



Globalt navnerum og dets problem

Det globale navnerum er det globale anvendelsesområde. Overvej følgende korte program:

#omfatte
ved hjælp af navneområde std;

intident= 55;
flydeident= 12.17;

intvigtigste()
{

Vend tilbage 0;
}

I ovenstående program er der to variabler, begge kaldet ident . Disse variabler er i det globale omfang; det vil sige, at de er i det globale navnerum. Et forsøg på at kompilere dette program mislykkes med en fejlmeddelelse. Det globale omfang accepterer ikke mere end én variabel med samme navn, så der er behov for et brugerdefineret navnerum.

Brugerdefineret navneområde

Et navnerum har ikke kun ét navn. I stedet har et navnerum et sæt navne for at undgå konflikt med andre sæt navne. For at undgå konflikter lavere i koden skal navnet på navneområdet og hvert navn stå foran hvert navn :: . Følgende program illustrerer dette ved hjælp af to brugerdefinerede navnerum:

#omfatte
ved hjælp af navneområde std;

navnerum NA
{
intvarInt= 6;
flydeflt;
}

navnerum NB
{
intvarInt= 7;
flydeflt;
}

intvigtigste()
{
koste<<NA::varInt << ' n';
koste<<NB::varInt << ' n';
NA::flt = 2.5;
NB::flt = 4.8;
koste<<NA::flt << ' n';
koste<<NB::flt << ' n';

Vend tilbage 0;
}

Outputtet er:

6
7
2.5
4.8

Bemærk, at navnene NA :: flt og NB :: flt i sidste ende er blevet defineret i main () fungere. C ++ tillader ikke en sådan definition i det globale omfang.

Bemærk, at det tilpassede navnerum er et indlejret navnerum for det globale navnerum.

Det anvendte direktiv

For at undgå at skrive navneplads :: navn hele tiden i stedet for bare navn efter angivelse af navneområdet, kan du bruge ved brug af direktiv. Syntaksen til brug af ved brug af direktivet er som følger:

ved hjælp af navnerum Namespace_name;

Det ved brug af direktiv er ikke et forbehandlingsdirektiv, så det ender med et semikolon (;).

Følgende program illustrerer brugen af ved brug af direktiv og mere:

#omfatte
ved hjælp af navneområde std;

navnerum NB
{
intvarInt= 7;
intfungere()
{
Vend tilbagevarInt;
}
}

intfn()
{
ved hjælp af navnerum NB;
intmyVar2=fungere();
// andre objekter og funktioner fra NB følger.
Vend tilbagemyVar2;
}

intmyVar3=NB::fungere();

intvigtigste()
{
koste<<fn() << '' <<myVar3<< ' n';

Vend tilbage 0;
}

Output af dette program er 7 7 . Begrebet ved hjælp af navnerum NB; er blevet placeret i begyndelsen af fn () definition. Det func () fra NB -navneområdet kaldes lige under det, uden at foregå med NB :: .

En variabel, der er deklareret i det globale omfang (globalt navnerum), ses fra erklæringspunktet til slutningen af ​​filen. Det ses også i de indlejrede navnerum (indlejrede scopes), såsom den indlejrede fn () funktionsomfang ovenfor. Det ved brug af direktiv slutter sit navnerum fra den position, det er placeret til slutningen af ​​det omfang, det er placeret i.

Navnet func () fra NB -navneområdet kan ikke ses under fn () definition fordi ved hjælp af navnerum NB; blev placeret inden for funktionsomfanget (blok). Under denne betingelse, at bruge func () uden for NB -navneområdet (omfang), skal det gå forud for NB :: , som i følgende erklæring:

intmyVar3=NB::fungere();

Det ved brug af direktiv forbinder sit navnerum med det ydre nestende navnerum fra den position, hvor det er placeret, til slutningen af ​​det ydre nestende navnerum. I det følgende program er NA -navnerummet forbundet med det globale navnerum. Begge navnerum strækker sig derefter ind i fn () funktionsdefinition navnerum, hvor de er forbundet med NB -navneområdet. NB -navneområdet slutter i slutningen af fn () funktionsdefinition, og de to tidligere navneområder fortsætter til slutningen af ​​filen (læs koden igennem).

#omfatte
ved hjælp af navneområde std;

navnerum NA
{
intvarInt= 6;
intfungere()
{
Vend tilbagevarInt;
}

}

navnerum NB
{
intvarInt= 7;
intfungere()
{
Vend tilbagevarInt;
}
}

ved hjælp af navnerum NA;
intmyVar0=varInt;
// andre objekter og funktioner fra :: og NB følger.

intfn()
{
intmyVar1=varInt;
ved hjælp af navnerum NB;
intmyVar2=NB::fungere();
// andre objekter og funktioner fra NB følger indtil slutningen af ​​dette omfang.
Vend tilbagemyVar1+myVar2;
}

// Kun objekter og funktioner fra :: og NB følger.

intmyVar3=NB::fungere();

intvigtigste()
{
koste<<myVar0<< '' <<fn() << '' <<myVar3<< ' n';

Vend tilbage 0;
}

Outputtet er 6, 13, 7 .

Bemærk: Det globale navnerum er angivet med :: , hvilket betyder, at der ikke er noget før omfangsopløsningsoperatøren, der følger.

Nedenfor erklæringen, ved hjælp af navnerum NA; variabler fra det globale og NA navnerum kan bruges uden angivelse af deres kilde navnerum. Den næste erklæring bruger varInt af NA -navneområdet. Den globale og NA -kombinerede navnerumregion strækker sig ind i fn () funktions navnerum. Så varInt af den første erklæring i fn () funktionsomfang, er af NA -navneområdet.

Da regionen for de globale og NA -navnerum strækker sig over hele fn () omfang, efter int myVar2 = NB :: func (); , ethvert navn fra NB -navneområdet kan kun bruges i fn () omfang uden at gå forud for det med NB :: , kun hvis det ikke forekom i NA og globale navnerum (blokke). Ellers bør det gå forud for NB :: . Regionen for de kombinerede navnerum for NA og global fortsætter under fn () definition og ind i main () funktion indtil slutningen af ​​filen.

Udvidelsen af ​​NB -navnerummet starter fra int myVar2 = NB :: func (); i fn () blok og slutter i slutningen af fn () definition blok.

Bemærk: Navneområder, hvis regioner er forbundet, bør ikke have det samme variabelnavn i deres forskellige navneområder, da dette stadig ville forårsage konflikt.

Navneområder

Et navnerum er et omfang. Bortset fra det globale navnerum (globalt omfang) bør ethvert navnerum deklareres i en blok. Denne blok er den første del af de muligvis distribuerede regioner i navneområdet. Med brugsdirektivet kan navneområdet udvides som regioner i andre anvendelsesområder.

Enheder, der er erklæret i et navnerum, siges at være medlemmer af navnerummet, og navne, der indføres med disse erklæringer i den deklarative region i navnerummet, siges at være medlemsnavne i navneområdet.

Indlejrede navneområder

Følgende program viser indlejrede navnerum:

#omfatte
ved hjælp af navneområde std;

navnerum A
{
intjeg= 1;
navneområde B
{
intjeg= 2;
navnerum C
{
intjeg= 3;
}
}
}

intvigtigste()
{
koste<<TIL::jeg << '' <<TIL::B::jeg << '' <<TIL::B::C::jeg << ' n';

Vend tilbage 0;
}

Outputtet er:

1 2 3

Bemærk, at der er adgang til de tre værdier ved hjælp af omfangsopløsningsoperatoren.

Standard navneområde

C ++ har et bibliotek kaldet standardbiblioteket. Navnene på objekter, funktioner og andre objekter i dette bibliotek stammer fra et navnerum kaldet standardnavneområdet, skrevet som timer . Standardbiblioteket indeholder underbiblioteker, og et af disse underbiblioteker er iostream . Det iostream biblioteket indeholder objektet koste , som bruges til at sende resultater til konsollen (terminal).

Navnet koste skal være i timer navnerum. At bruge iostream med dens timer navnerum, skal programmet være som følger:

#omfatte
ved hjælp af navneområde std;

Bemærk brugen af ved brug af direktiv og timer . Begrebet #omfatte er et forbehandlingsdirektiv og slutter ikke med et semikolon. Den indeholder iostream -filen på det sted, hvor direktivet er.

Konklusion

Et navnerum er et omfang. Navnepladsbeskrivelsen (definition) indeholder grundlæggende erklæringer og/eller definitioner af C ++ - objekter, funktioner og andre objekter. Uden for navneområdet definition kan man få adgang til navnet med syntaksen, namespaceName :: navn . Bortset fra det globale navnerum (globalt omfang) bør ethvert navnerum deklareres i en blok. Denne blok er den første del af de muligvis distribuerede regioner i navneområdet. Med ved brug af direktiv, kan navneområdet udvides som regioner i andre anvendelsesområder. Navneområder, hvis regioner er forbundet, bør ikke have det samme variabelnavn i deres forskellige navneområder, da dette stadig ville forårsage navnekonflikter.

Chrys