logo

Espai de noms en C++ | Set 1 (Introducció)

  • L'espai de noms proporciona l'espai on podem definir o declarar l'identificador, és a dir, variable, mètode, classes.
  • Amb l'espai de noms, podeu definir l'espai o el context en què es defineixen els identificadors, és a dir, variable, mètode, classes. En essència, un espai de noms defineix un àmbit.

Avantatge de l'espai de noms per evitar la col·lisió de noms.

  • Per exemple, és possible que estigueu escrivint algun codi que tingui una funció anomenada xyz() i hi hagi una altra biblioteca disponible que també té la mateixa funció xyz(). Ara el compilador no té manera de saber a quina versió de la funció xyz() us referiu al vostre codi.
  • Un espai de noms està dissenyat per superar aquesta dificultat i s'utilitza com a informació addicional per diferenciar funcions, classes, variables, etc. similars amb el mateix nom disponibles en diferents biblioteques.
  • El millor exemple d'abast de l'espai de noms és la biblioteca estàndard de C++ (std) on es declaren totes les classes, mètodes i plantilles. Per tant, mentre escrivim un programa C++, normalment incloem la directiva utilitzant l'espai de noms std;

Definició d'un espai de noms:

  • Una definició d'espai de noms comença amb la paraula clau espai de noms seguida del nom de l'espai de noms de la manera següent:
namespace namespace_name { // code declarations i.e. variable (int a;) method (void add();) classes ( class student{};) }>
  • Cal tenir en compte que no hi ha punt i coma (;) després de la clau de tancament.
  • Per cridar a la versió habilitada per a l'espai de noms de la funció o de la variable, anteposeu el nom de l'espai de noms de la manera següent:
  • nom_espai de noms: :codi; // el codi pot ser variable, funció o classe.

La directiva d'ús:

  • També podeu evitar la preposició d'espais de noms amb la directiva using namespace. Aquesta directiva indica al compilador que el codi següent fa ús de noms a l'espai de noms especificat.
  • Així, l'espai de noms està implícit per al codi següent:

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;> }>

>



>

Sortida

Inside first_space>
  • Els noms introduïts en una directiva d'ús obeeixen les regles d'àmbit normal. El nom és visible des del punt de la directiva using fins al final de l'àmbit en què es troba la directiva. Les entitats amb el mateix nom definits en un àmbit extern s'amaguen.

Espais de noms imbricats:

  • Els espais de noms es poden imbricar on podeu definir un espai de noms dins d'un altre espai de noms de la manera següent:
SYNTAX: namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }>

Podeu accedir als membres de l'espai de noms imbricat mitjançant els operadors de resolució de la següent manera:
// per accedir als membres de namespace_name2
utilitzant l'espai de noms namespace_name1::namespace_name2;
// per accedir als membres de namespace_name1
utilitzant l'espai de noms namespace_name1;

A les declaracions anteriors, si utilitzeu namespace_name1, farà que els elements de namespace_name2 estiguin disponibles a l'abast de la manera següent:

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;> }>

>

>

Sortida

Inside second_space>

Vegem com l'espai de noms inclou les entitats, incloses les variables i les funcions:

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;> }>

>

>

Sortida

Inside first_space Inside second_space>

Considereu el següent programa C++:

CPP




// A program to demonstrate need of namespace> int> main()> {> >int> value;> >value = 0;> >double> value;>// Error here> >value = 0.0;> }>

>

>

Sortida:

Compiler Error: 'value' has a previous declaration as 'int value'>

En cada àmbit, un nom només pot representar una entitat. Per tant, no hi pot haver dues variables amb el mateix nom en el mateix àmbit. Utilitzant espais de noms, podem crear dues variables o funcions membre amb el mateix nom.

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;> }>

>

>

Sortida

500>

Definició i creació: Els espais de noms ens permeten agrupar entitats amb nom que d'una altra manera tindrien àmbit global en àmbits més estrets, donant-los àmbit de l'espai de noms . Això permet organitzar els elements dels programes en diferents àmbits lògics referits per noms. Els espais de noms proporcionen l'espai on podem definir o declarar identificadors, és a dir, noms de variables, mètodes, classes, etc.

  • Un espai de noms és una característica afegida a C++ i no està present a C.
  • Un espai de noms és una regió declarativa que proporciona un abast als identificadors (noms de funcions, variables o altres tipus de dades definits per l'usuari) dins d'ell.
  • Es permeten diversos blocs d'espai de noms amb el mateix nom. Totes les declaracions dins d'aquests blocs es declaren en l'àmbit esmentat.

Una definició d'espai de noms comença amb la paraula clau espai de noms seguit del nom de l'espai de noms de la manera següent:

namespace namespace_name { int x, y; // code declarations where // x and y are declared in // namespace_name's scope }>
  • Les declaracions d'espai de noms només apareixen a l'àmbit global.
  • Les declaracions d'espai de noms es poden imbricar dins d'un altre espai de noms.
  • Les declaracions d'espai de noms no tenen especificadors d'accés (públics o privats).
  • No cal posar un punt i coma després de la clau de tancament de la definició d'espai de noms.
  • Podem dividir la definició d'espai de noms en diverses unitats.

Definició d'un espai de noms:

Una definició d'espai de noms comença amb la paraula clau espai de noms seguida del nom de l'espai de noms de la manera següent:

C++




com tancar el mode de desenvolupador

namespace> namespace_name{> >// code declarations i.e. variable (int a;)> >method (>void> add();)> >classes (>class> student{};)> }>

>

>

Cal tenir en compte que no hi ha punt i coma (;) després de la clau de tancament.
Per cridar a la versió habilitada per a l'espai de noms d'una funció o d'una variable, anteposeu el nom de l'espai de noms de la manera següent:

nom_espai de noms: :codi; // el codi podria ser una variable, funció o classe.

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>

>

>

Sortida

Inside first_space Inside second_space>

La directiva d'ús:

Podeu evitar la preposició d'espais de noms amb la directiva using namespace. Aquesta directiva indica al compilador que el codi següent fa ús de noms a l'espai de noms especificat. Així, l'espai de noms està implícit per al codi següent:

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>

>

>

Sortida

Inside first_space>

En lloc d'accedir a tot l'espai de noms, una altra opció (coneguda com utilitzant declaration) és accedir a un element concret dins d'un espai de noms. Per exemple, si l'única part de l'espai de noms std que voleu utilitzar és cout, podeu fer-hi referència de la següent manera:
utilitzant std::cout;
El codi posterior pot fer referència a cout sense anteposar l'espai de noms, però els altres elements de l'espai de noms std encara hauran de ser explícits de la manera següent:

C++




#include> using> std::cout;> int> main ()> {> >cout <<>'std::endl is used with std!'> << std::endl;> >return> 0;> }>

>

>

Sortida

std::endl is used with std!>

Els noms introduïts en una directiva d'ús obeeixen les regles d'abast normal, és a dir, són visibles des del punt en què es produeix la directiva d'ús fins al final de l'àmbit en què es troba la directiva. Les entitats amb el mateix nom definits en un àmbit extern s'amaguen.

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;> }>

>

>

Sortida:

5 200 100>

Classes i espai de noms: La següent és una manera senzilla de crear classes en un espai de noms:

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; }>

>

>

Sortida

ns::geek::display()>

Una classe també es pot declarar dins de l'espai de noms i definir-se fora de l'espai de noms utilitzant la sintaxi següent:

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;> }>

>

>

Sortida

ns::geek::display()>

També podem definir mètodes fora de l'espai de noms . El següent és un exemple de codi:

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;> }>

>

>

Sortida:

ns::display() ns::geek::display():>

Espais de noms imbricats:

Els espais de noms es poden imbricar, és a dir, podeu definir un espai de noms dins d'un altre espai de noms de la manera següent:

C++




namespace> namespace_name1 {> >// code declarations> >namespace> namespace_name2 {> >// code declarations> >}> }>

>

>

Podeu accedir als membres d'un espai de noms imbricat mitjançant l'operador de resolució (::) de la manera següent:

C++




// to access members of namespace_name2> using> namespace> namespace_name1::namespace_name2;> // to access members of namespace:name1> using> namespace> namespace_name1;>

>

>

A les declaracions anteriors, si utilitzeu namespace_name1, farà que els elements de namespace_name2 estiguin disponibles a l'abast de la manera següent:

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>

>

>

Sortida

Inside second_space>

L'espai de noms ofereix l'avantatge d'evitar la col·lisió de noms:

Per exemple, és possible que estigueu escrivint algun codi que tingui una funció anomenada xyz() i hi hagi una altra biblioteca disponible al vostre codi que també té la mateixa funció xyz(). Ara el compilador no té manera de saber a quina versió de la funció xyz() us referiu al vostre codi.
Un espai de noms està dissenyat per superar aquesta dificultat i s'utilitza com a informació addicional per diferenciar funcions, classes, variables, etc. similars amb el mateix nom disponibles en diferents biblioteques.
El millor exemple d'abast de l'espai de noms és la biblioteca estàndard de C++ (std), on es declaren totes les classes, mètodes i plantilles. Per tant, mentre escrivim un programa C++, normalment incloem la directiva
utilitzant namespace std;

espai de noms en C++ | Conjunt 2 (espai de noms extensiu i espai de noms sense nom) Espai de noms en C++ | Conjunt 3 (Accés, creació de capçalera, nidificació i àlies) Els espais de noms es poden imbricar en C++? Referència : http://www.cplusplus.com/doc/tutorial/namespaces/