Spazi dei nomi in C ++
Considera una situazione in cui abbiamo due persone con lo stesso nome, Zara, nella stessa classe. Ogni volta che abbiamo bisogno di differenziarli definitivamente, dovremmo usare alcune informazioni aggiuntive insieme al loro nome, come l'area, se vivono in un'area diversa o il nome della madre o del padre, ecc.
La stessa situazione può verificarsi nelle applicazioni C ++. Ad esempio, potresti scrivere del codice che ha una funzione chiamata xyz () ed è disponibile un'altra libreria che ha anche la stessa funzione xyz (). Ora il compilatore non ha modo di sapere a quale versione della funzione xyz () ti riferisci all'interno del tuo codice.
UN namespaceè progettato per superare questa difficoltà e viene utilizzato come informazione aggiuntiva per differenziare funzioni, classi, variabili, ecc. simili con lo stesso nome disponibili in diverse librerie. Utilizzando lo spazio dei nomi, è possibile definire il contesto in cui vengono definiti i nomi. In sostanza, uno spazio dei nomi definisce un ambito.
Definizione di uno spazio dei nomi
Una definizione di spazio dei nomi inizia con la parola chiave namespace seguito dal nome dello spazio dei nomi come segue:
namespace namespace_name {
// code declarations
}
Per chiamare la versione abilitata per lo spazio dei nomi di una funzione o di una variabile, anteponi (: :) al nome dello spazio dei nomi come segue:
name::code; // code could be variable or function.
Vediamo in che modo lo spazio dei nomi definisce l'ambito delle entità, comprese le variabili e le funzioni:
#include <iostream>
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;
}
Se compiliamo ed eseguiamo il codice sopra, questo produrrebbe il seguente risultato:
Inside first_space
Inside second_space
La direttiva using
Puoi anche evitare di anteporre agli spazi dei nomi using namespacedirettiva. Questa direttiva indica al compilatore che il codice successivo utilizza i nomi nello spazio dei nomi specificato. Lo spazio dei nomi è quindi implicito per il codice seguente:
#include <iostream>
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;
}
Se compiliamo ed eseguiamo il codice sopra, questo produrrebbe il seguente risultato:
Inside first_space
La direttiva 'using' può essere utilizzata anche per fare riferimento 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:
using std::cout;
Il codice successivo può fare riferimento a cout senza anteporre lo spazio dei nomi, ma altri elementi nel file std lo spazio dei nomi dovrà comunque essere esplicito come segue:
#include <iostream>
using std::cout;
int main () {
cout << "std::endl is used with std!" << std::endl;
return 0;
}
Se compiliamo ed eseguiamo il codice sopra, questo produrrebbe il seguente risultato:
std::endl is used with std!
Nomi introdotti in a usingla direttiva obbedisce alle normali regole di ambito. Il nome è visibile dalla punta delusingdirettiva fino alla fine del campo di applicazione in cui si trova la direttiva. Le entità con lo stesso nome definite in un ambito esterno vengono nascoste.
Spazi dei nomi non contigui
Uno spazio dei nomi può essere definito in più parti e quindi uno spazio dei nomi è costituito dalla somma delle sue parti definite separatamente. Le parti separate di uno spazio dei nomi possono essere distribuite su più file.
Quindi, se una parte dello spazio dei nomi richiede un nome definito in un altro file, quel nome deve comunque essere dichiarato. Scrivere una definizione di spazio dei nomi seguente definisce un nuovo spazio dei nomi o aggiunge nuovi elementi a uno esistente -
namespace namespace_name {
// code declarations
}
Spazi dei nomi annidati
Gli spazi dei nomi possono essere annidati dove è possibile definire uno spazio dei nomi all'interno di un altro spazio dei nomi come segue:
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:
// 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 si utilizza namespace_name1, renderà disponibili gli elementi di namespace_name2 nell'ambito come segue:
#include <iostream>
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;
}
Se compiliamo ed eseguiamo il codice sopra, questo produrrebbe il seguente risultato:
Inside second_space