- Lo spazio dei nomi fornisce lo spazio in cui possiamo definire o dichiarare l'identificatore, ovvero variabile, metodo, classi.
- Utilizzando lo spazio dei nomi, è possibile definire lo spazio o il contesto in cui vengono definiti gli identificatori, ad esempio variabile, metodo, classi. In sostanza, uno spazio dei nomi definisce un ambito.
Vantaggio di Namespace per evitare collisioni di nomi.
- Ad esempio, potresti scrivere del codice che ha una funzione chiamata xyz() ed è disponibile un'altra libreria che ha anch'essa la stessa funzione xyz(). Ora il compilatore non ha modo di sapere a quale versione della funzione xyz() ti riferisci nel tuo codice.
- Uno spazio dei nomi è progettato per superare questa difficoltà e viene utilizzato come informazione aggiuntiva per differenziare funzioni, classi, variabili simili, ecc. Con lo stesso nome disponibili in diverse librerie.
- Il miglior esempio di ambito dello spazio dei nomi è la libreria standard C++ (std) in cui sono dichiarati tutte le classi, i metodi e i modelli. Quindi durante la scrittura di un programma C++ solitamente includiamo la direttiva using namespace std;
Definizione di uno spazio dei nomi:
- Una definizione di spazio dei nomi inizia con la parola chiave namespace seguita dal nome dello spazio dei nomi come segue:
namespace namespace_name { // code declarations i.e. variable (int a;) method (void add();) classes ( class student{};) }> - È da notare che non c'è il punto e virgola (;) dopo la parentesi graffa di chiusura.
- Per chiamare la versione abilitata allo spazio dei nomi di una funzione o di una variabile, anteporre il nome dello spazio dei nomi come segue:
- nome_spazio_nome: :codice; // il codice potrebbe essere una variabile, una funzione o una classe.
La direttiva using:
- Puoi anche evitare di anteporre gli spazi dei nomi con la direttiva using namespace. Questa direttiva indica al compilatore che il codice successivo utilizza nomi nello spazio dei nomi specificato.
- Lo spazio dei nomi è quindi implicito per il seguente codice:
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;> }> |
>
>Produzione
Inside first_space>
- I nomi introdotti in una direttiva using obbediscono alle normali regole di ambito. Il nome è visibile dal punto della direttiva using fino alla fine dell'ambito in cui si trova la direttiva. Le entità con lo stesso nome definite in un ambito esterno vengono nascoste.
Spazi dei nomi nidificati:
- Gli spazi dei nomi possono essere nidificati in cui è possibile definire uno spazio dei nomi all'interno di un altro spazio dei nomi come segue:
SYNTAX: namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }> È possibile accedere ai membri dello spazio dei nomi nidificato utilizzando gli operatori di risoluzione come segue:
// per accedere ai membri di namespace_name2
utilizzando lo spazio dei nomi namespace_name1::namespace_name2;
// per accedere ai membri di namespace_name1
utilizzando lo spazio dei nomi namespace_name1;
Nelle istruzioni precedenti, se utilizzi namespace_name1, gli elementi di namespace_name2 saranno disponibili nell'ambito come segue:
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;> }> |
>
>Produzione
Inside second_space>
Vediamo come lo spazio dei nomi ambito delle entità incluse variabili e funzioni:
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;> }> |
>
>Produzione
Inside first_space Inside second_space>
Consideriamo il seguente programma C++:
CPP
// A program to demonstrate need of namespace> int> main()> {> >int> value;> >value = 0;> >double> value;>// Error here> >value = 0.0;> }> |
>
>
Produzione :
qual è il numero dell'alfabeto
Compiler Error: 'value' has a previous declaration as 'int value'>
In ogni ambito, un nome può rappresentare solo un'entità. Pertanto non possono esserci due variabili con lo stesso nome nello stesso ambito. Utilizzando gli spazi dei nomi, possiamo creare due variabili o funzioni membro con lo stesso nome.
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;> }> |
>
>Produzione
500>
Definizione e creazione: Gli spazi dei nomi ci consentono di raggruppare entità denominate che altrimenti lo avrebbero portata globale in ambiti più ristretti, dando loro ambito dello spazio dei nomi . Ciò consente di organizzare gli elementi dei programmi in diversi ambiti logici indicati tramite nomi. Gli spazi dei nomi forniscono lo spazio in cui possiamo definire o dichiarare identificatori, ad esempio nomi di variabili, metodi, classi, ecc.
- Uno spazio dei nomi è una funzionalità aggiunta in C++ e non è presente in C.
- Uno spazio dei nomi è una regione dichiarativa che fornisce un ambito agli identificatori (nomi di funzioni, variabili o altri tipi di dati definiti dall'utente) al suo interno.
- Sono consentiti più blocchi di spazi dei nomi con lo stesso nome. Tutte le dichiarazioni all'interno di questi blocchi vengono dichiarate nell'ambito denominato.
Una definizione di spazio dei nomi inizia con la parola chiave spazio dei nomi seguito dal nome dello spazio dei nomi come segue:
namespace namespace_name { int x, y; // code declarations where // x and y are declared in // namespace_name's scope }> - Le dichiarazioni dello spazio dei nomi vengono visualizzate solo nell'ambito globale.
- Le dichiarazioni dello spazio dei nomi possono essere nidificate all'interno di un altro spazio dei nomi.
- Le dichiarazioni dello spazio dei nomi non hanno specificatori di accesso (pubblico o privato).
- Non è necessario inserire un punto e virgola dopo la parentesi graffa di chiusura della definizione di namespace.
- Possiamo dividere la definizione di namespace su più unità.
Definizione di uno spazio dei nomi:
Una definizione di spazio dei nomi inizia con la parola chiave namespace seguita dal nome dello spazio dei nomi come segue:
C++
mappatura in dattiloscritto
namespace> namespace_name{> >// code declarations i.e. variable (int a;)> >method (>void> add();)> >classes (>class> student{};)> }> |
>
>
È da notare che non c'è il punto e virgola (;) dopo la parentesi graffa di chiusura.
Per chiamare la versione abilitata allo spazio dei nomi di una funzione o di una variabile, anteporre il nome dello spazio dei nomi come segue:
nome_spazio_nome: :codice; // il codice potrebbe essere una variabile, una funzione o una 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> |
>
>Produzione
Inside first_space Inside second_space>
La direttiva using:
Puoi evitare di anteporre gli spazi dei nomi con la direttiva using namespace. Questa direttiva indica al compilatore che il codice successivo utilizza nomi nello spazio dei nomi specificato. Lo spazio dei nomi è quindi implicito per il seguente codice:
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> |
>
>Produzione
Inside first_space>
Invece di accedere all'intero spazio dei nomi, un'altra opzione (nota come utilizzando dichiarazione) consiste nell'accedere a un particolare elemento all'interno di uno spazio dei nomi. Ad esempio, se l'unica parte dello spazio dei nomi std che intendi utilizzare è cout, puoi fare riferimento ad esso come segue:
utilizzando std::cout;
Il codice successivo può fare riferimento a cout senza anteporre lo spazio dei nomi, ma gli altri elementi nello spazio dei nomi std dovranno comunque essere espliciti come segue:
C++
#include> using> std::cout;> int> main ()> {> >cout <<>'std::endl is used with std!'> << std::endl;> >return> 0;> }> |
>
>Produzione
std::endl is used with std!>
I nomi introdotti in una direttiva using obbediscono alle normali regole di ambito, cioè sono visibili dal punto in cui ricorre la direttiva using fino alla fine dell'ambito in cui si trova la direttiva. Le entità con lo stesso nome definite in un ambito esterno vengono nascoste.
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;> }> |
>
>
Produzione:
5 200 100>
Classi e spazio dei nomi: Quello che segue è un modo semplice per creare classi in uno spazio dei nomi:
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; }> |
>
>Produzione
ns::geek::display()>
Una classe può anche essere dichiarata all'interno dello spazio dei nomi e definita all'esterno dello spazio dei nomi utilizzando la seguente sintassi:
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;> }> |
>
>Produzione
ns::geek::display()>
Possiamo definire metodi anche al di fuori dello spazio dei nomi . Quello che segue è un codice di esempio:
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;> }> |
>
>
Produzione:
ns::display() ns::geek::display():>
Spazi dei nomi nidificati:
Gli spazi dei nomi possono essere nidificati, ovvero è possibile definire uno spazio dei nomi all'interno di un altro spazio dei nomi come segue:
C++
alfabeto e numeri
namespace> namespace_name1 {> >// code declarations> >namespace> namespace_name2 {> >// code declarations> >}> }> |
>
>
È possibile accedere ai membri di uno spazio dei nomi nidificato utilizzando l'operatore di risoluzione (::) come segue:
C++
// to access members of namespace_name2> using> namespace> namespace_name1::namespace_name2;> // to access members of namespace:name1> using> namespace> namespace_name1;> |
>
>
Nelle istruzioni precedenti, se stai utilizzando namespace_name1, gli elementi di namespace_name2 saranno disponibili nell'ambito come segue:
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> |
>
>Produzione
Inside second_space>
Lo spazio dei nomi offre il vantaggio di evitare la collisione dei nomi: -
Ad esempio, potresti scrivere del codice che ha una funzione chiamata xyz() e nel tuo codice è disponibile un'altra libreria che ha anch'essa la stessa funzione xyz(). Ora il compilatore non ha modo di sapere a quale versione della funzione xyz() ti riferisci nel tuo codice.
Uno spazio dei nomi è progettato per superare questa difficoltà e viene utilizzato come informazione aggiuntiva per differenziare funzioni, classi, variabili simili, ecc. Con lo stesso nome disponibili in diverse librerie.
Il miglior esempio di ambito dello spazio dei nomi è la libreria standard C++ (std), dove vengono dichiarate tutte le classi, i metodi e i modelli. Pertanto, quando scriviamo un programma C++, solitamente includiamo la direttiva
utilizzando lo spazio dei nomi std;
spazio dei nomi in C++ | Set 2 (spazio dei nomi esteso e spazio dei nomi senza nome) Spazio dei nomi in C++ | Set 3 (accesso, creazione di intestazioni, annidamento e alias) Gli spazi dei nomi possono essere annidati in C++? Riferimento : http://www.cplusplus.com/doc/tutorial/namespaces/