Espai de noms C ++

C Namespace



Un espai de noms a C ++ és un abast generalitzat. La seva declaració comença amb la paraula reservada, espai de noms, seguida d’un nom que el programador tria i, a continuació, el bloc entre claus. El bloc conté declaracions i / o definicions bàsiques d'objectes, funcions i altres entitats C ++.

Penseu en les següents dues afirmacions escalars en un àmbit global, al programa següent:







#incloure
utilitzant l'espai de noms std;

intvarId= 5;
flotarvarId= 2.3;

intprincipal()
{

tornar 0;
}

Un intent de compilar aquest programa comporta un error de compilació. Hi ha dues variables amb el mateix nom, varId . Tot i que són dues variables diferents de dos tipus diferents, int i flotar , el compilador rebutja les dues declaracions perquè tenen el mateix nom. El programa següent resol aquest problema declarant les variables amb el mateix nom en dos àmbits generalitzats diferents:



#incloure
utilitzant l'espai de noms std;

espai de noms NA
{
intvarId= 5;
}

espai de noms NB
{
flotarvarId= 2.3;
}

intprincipal()
{
cost<<NA::varId << ' n';
cost<<NB::varId << ' n';

tornar 0;
}

La sortida és la següent:



5
2.3

Hi ha dos espais de noms al programa anterior: NA , que té la definició d'un nombre enter, i NB , que té la definició de float però amb el mateix nom que l’enter de NA. Finalment, quan es va executar el programa, es va utilitzar el mateix nom per a dues variables diferents. Tingueu en compte que per accedir al mateix nom de dues variables diferents, s’ha d’utilitzar el nom particular de l’espai de noms, seguit de l’identificador comú. El nom de l'espai de noms i l'identificador comú estan separats per l'operador de resolució d'abast, :: . El nom dels espais de noms diferenciarà els objectes.





Aquest article tracta el concepte bàsic d'un espai de noms i el seu ús en el llenguatge de programació C ++. Per seguir aquest article, heu de tenir un coneixement bàsic del llenguatge C ++. També heu de tenir coneixement de l’abast de C ++, tot i que s’explica breument en aquest article. Per obtenir més informació sobre l'abast de C ++, cerqueu la frase, Abast en C ++ (sense cometes) al quadre de cerca de qualsevol pàgina web de linuxhint.com i premeu Retorn. Això us conduirà a l'article que va escriure aquest autor.

Contingut de l'article

Què és un espai de noms?

Una regió declarativa és la part més gran d'un programa en què el nom d'una entitat (variable) és vàlid. Aquesta regió s’anomena àmbit d’aplicació. Un espai de noms a C ++ és un àmbit generalitzat que té com a finalitat principal resoldre conflictes de noms. Un espai de noms té declaracions i / o definicions bàsiques d'entitats.



Espai de noms global i el seu problema

L’espai de noms global és l’abast global. Penseu en el programa breu següent:

#incloure
utilitzant l'espai de noms std;

intident= 55;
flotarident= 12.17;

intprincipal()
{

tornar 0;
}

Al programa anterior, hi ha dues variables, ambdues anomenades ident . Aquestes variables són a l'abast global; és a dir, es troben a l’espai de noms global. Un intent de compilar aquest programa fallarà amb un missatge d'error. L'abast global no accepta més d'una variable amb el mateix nom, de manera que cal un espai de noms personalitzat.

Espai de noms personalitzat

Un espai de noms no té només un nom. En canvi, un espai de noms té un conjunt de noms per evitar conflictes amb altres conjunts de noms. Per evitar conflictes més baixos al codi, precedeix cada nom amb el nom de l'espai de noms i :: . El programa següent il·lustra això fent servir dos espais de noms personalitzats:

#incloure
utilitzant l'espai de noms std;

espai de noms NA
{
intvarInt= 6;
flotarflt;
}

espai de noms NB
{
intvarInt= 7;
flotarflt;
}

intprincipal()
{
cost<<NA::varInt << ' n';
cost<<NB::varInt << ' n';
NA::flt = 2.5;
NB::flt = 4.8;
cost<<NA::flt << ' n';
cost<<NB::flt << ' n';

tornar 0;
}

La sortida és:

6
7
2.5
4.8

Tingueu en compte que els noms NA :: flt i NB :: flt s'han definit finalment a la main () funció. C ++ no permet aquesta definició a l'abast global.

Tingueu en compte que l’espai de noms personalitzat és un espai de noms niat per a l’espai de noms global.

La Directiva d’ús

Per evitar escriure namepace :: name tot el temps en lloc de nom només després de declarar l'espai de noms, podeu utilitzar el fitxer utilitzant directiva. La sintaxi per utilitzar el fitxer utilitzant directiva és la següent:

utilitzant l’espai de noms Nom de l’espai de noms;

El utilitzant directiva no és una directiva de preprocessador, de manera que acaba amb un punt i coma (;).

El programa següent il·lustra l'ús del fitxer utilitzant directiva i molt més:

#incloure
utilitzant l'espai de noms std;

espai de noms NB
{
intvarInt= 7;
intfunció()
{
tornarvarInt;
}
}

intfn()
{
utilitzant l'espai de noms NB;
intmyVar2=funció();
// Segueixen altres objectes i funcions de NB.
tornarmyVar2;
}

intmyVar3=NB::funció();

intprincipal()
{
cost<<fn() << '' <<myVar3<< ' n';

tornar 0;
}

La sortida d’aquest programa és juliol 7 . El terme utilitzant l'espai de noms NB; s'ha col·locat a principis del fn () definició. El func () des de l'espai de noms NB es diu just a sota, sense precedir amb NB :: .

Una variable declarada a l'abast global (espai de noms global) es veu des del punt de declaració fins al final del fitxer. També es veu als espais de noms imbricats (àmbits imbricats), com ara el nidificat fn () abast de la funció anterior. El utilitzant La directiva uneix el seu espai de noms des de la posició en què es troba fins al final de l'abast en què es troba.

El nom func () des de l'espai de noms NB no es pot veure a sota de fn () definició perquè utilitzant l'espai de noms NB; s'ha situat dins de l'abast de la funció (bloc). En aquesta condició, per utilitzar func () fora del bloc d'espai de noms NB (abast), ha d'anar precedit de NB :: , com a la següent afirmació:

intmyVar3=NB::funció();

El utilitzant La directiva uneix el seu espai de noms amb l’espai de noms de nidificació exterior des de la posició en què es col·loca fins al final de l’espai de noms de nidificació exterior. Al programa següent, l'espai de noms NA s'uneix a l'espai de noms global. Els dos espais de noms s'estenen al fitxer fn () espai de noms de definició de funció, en el qual s’uneixen amb l’espai de noms NB. L 'espai de noms NB finalitza al final del fitxer fn () definició de la funció, i els dos espais de noms anteriors continuen fins al final del fitxer (llegiu el codi).

#incloure
utilitzant l'espai de noms std;

espai de noms NA
{
intvarInt= 6;
intfunció()
{
tornarvarInt;
}

}

espai de noms NB
{
intvarInt= 7;
intfunció()
{
tornarvarInt;
}
}

utilitzant l’espai de noms NA;
intmyVar0=varInt;
// Segueixen altres objectes i funcions de :: i NB.

intfn()
{
intmyVar1=varInt;
utilitzant l'espai de noms NB;
intmyVar2=NB::funció();
// Segueixen altres objectes i funcions de NB fins al final d'aquest àmbit.
tornarmyVar1+myVar2;
}

// Només segueixen els objectes i funcions de :: i NB.

intmyVar3=NB::funció();

intprincipal()
{
cost<<myVar0<< '' <<fn() << '' <<myVar3<< ' n';

tornar 0;
}

La sortida és 6, 13, 7 .

Nota: L’espai de noms global s’indica amb :: , és a dir, que no hi hagi res davant l'operador de resolució d'abast que segueixi.

A sota de la declaració, el fitxer utilitzant l’espai de noms NA; Les variables de l'espai de noms global i NA es poden utilitzar sense indicar el seu espai de noms d'origen. La següent sentència utilitza el fitxer varInt de l’espai de noms NA. La regió de noms combinats global i NA s'estén fins al fn () espai de noms de funció. Doncs el varInt de la primera afirmació del fn () l'àmbit de la funció, és de l'espai de noms NA.

Atès que la regió per als espais de noms global i NA s'estén per tot el territori fn () abast, després del int myVar2 = NB :: func (); , qualsevol nom de l'espai de noms NB només es pot utilitzar a fn () abast sense precedir-lo amb NB :: , només si no es va produir als espais de noms (blocs) NA i globals. En cas contrari, hauria d’anar precedit de NB :: . La regió dels espais de noms combinats per a NA i global continua per sota de fn () definició i en el main () fins al final del fitxer.

L'extensió de l'espai de noms NB comença a partir de int myVar2 = NB :: func (); al fn () bloc i finalitza al final del fitxer fn () bloc de definició.

Nota: Els espais de noms les regions dels quals s’uneixen no haurien de tenir el mateix nom de variable en els diferents blocs d’espais de noms, ja que això encara causaria conflictes.

Regions d'espai de noms

Un espai de noms és un abast. A part de l’espai de noms global (abast global), qualsevol espai de noms s’ha de declarar en un bloc. Aquest bloc és la primera part de les regions possiblement distribuïdes de l'espai de noms. Amb la directiva d'ús, l'espai de noms es pot ampliar com a regions d'altres àmbits.

Es diu que les entitats declarades en un cos de l’espai de noms són membres de l’espai de noms, i es diu que els noms introduïts per aquestes declaracions a la regió declarativa de l’espai de noms són noms de membres de l’espai de noms.

Espais de noms imbricats

El programa següent mostra espais de noms imbricats:

#incloure
utilitzant l'espai de noms std;

espai de noms A.
{
intjo= 1;
espai de noms B
{
intjo= 2;
espai de noms C.
{
intjo= 3;
}
}
}

intprincipal()
{
cost<<A::jo << '' <<A::B::jo << '' <<A::B::C::jo << ' n';

tornar 0;
}

La sortida és:

1 2 3

Tingueu en compte que s'ha accedit als tres valors mitjançant l'operador de resolució d'abast.

Espai de noms estàndard

C ++ té una biblioteca anomenada biblioteca estàndard. Els noms d'objectes, funcions i altres entitats d'aquesta biblioteca provenen d'un espai de noms anomenat espai de noms estàndard, escrit com hores . La biblioteca estàndard conté sub-biblioteques i una d’aquestes és iostream . El iostream La biblioteca conté l'objecte cost , que s’utilitza per enviar resultats a la consola (terminal).

El nom cost ha de ser al hores espai de noms. Usar iostream amb la seva hores espai de noms, el programa hauria de ser el següent:

#incloure
utilitzant l'espai de noms std;

Tingueu en compte l'ús del fitxer utilitzant directiva i hores . El terme #incloure és una directiva de preprocessador i no acaba amb punt i coma. Inclou el fitxer iostream a la posició de la seva directiva.

Conclusió

Un espai de noms és un abast. La descripció (definició) de l’espai de noms conté declaracions bàsiques i / o definicions d’objectes, funcions i altres entitats C ++. Fora de la definició de l’espai de noms, es pot accedir al nom amb la sintaxi, namespaceName :: nom . A part de l’espai de noms global (abast global), qualsevol espai de noms s’ha de declarar en un bloc. Aquest bloc és la primera part de les regions possiblement distribuïdes de l'espai de noms. Amb el utilitzant directiva, l’espai de noms es pot ampliar com a regions d’altres àmbits. Els espais de noms les regions dels quals s’uneixen no haurien de tenir el mateix nom de variable en els diferents blocs d’espais de noms, ja que això encara causaria conflictes de noms.

Chrys