'>

C Plus Plus: Espaces de noms

Espaces de noms permettent à des entités du groupe, comme les classes, les objets et les fonctions sous un autre nom. De cette façon, la portée mondiale peut être divisée en "sous-champs", chacun avec son propre nom.

Le format des espaces de nommage est:

identificateur d'espace de noms
{
entités
}

Où identificateur est un identificateur et entités valable est l'ensemble des classes, des objets et des fonctions qui sont inclus dans l'espace de noms. Par exemple:

1
 2
 3
 4


   

 namespace myNamespace { int a, b; }



Dans ce cas, les variables a et b sont des variables normales déclarées dans un espace de noms appelé monNamespace. Pour accéder à ces variables de l'extérieur l'espace de noms monNamespace nous devons utiliser l'opérateur de portée ::. Par exemple, pour accéder aux variables précédentes de monNamespace extérieur, nous pouvons écrire:

 1
 2


   

 myNamespace::a myNamespace::b



La fonctionnalité des espaces de noms est particulièrement utile dans le cas où il ya une possibilité qu'un objet ou une fonction globale utilise le même identifiant que l'autre, provoquant des erreurs de redéfinition. Par exemple:

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19


   

 // namespaces #include <iostream> using namespace std; namespace first { int var = 5; } namespace second { double var = 3.1416; } int main () { cout << first::var << endl; cout << second::var << endl; return 0; }

   

  5
  3,1416



Dans ce cas, il ya deux variables globales avec le même nom: var. On est définie dans le namespace première et l'autre en seconde. Aucune erreur de redéfinition se produisent grâce à des espaces de noms.

aide
Le mot-clé à l'aide est utilisée pour introduire un nom à partir d'un espace de noms dans la région déclarative actuelle. Par exemple:

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25


   

 // using #include <iostream> using namespace std; namespace first { int x = 5; int y = 10; } namespace second { double x = 3.1416; double y = 2.7183; } int main () { using first::x; using second::y; cout << x << endl; cout << y << endl; cout << first::y << endl; cout << second::x << endl; return 0; }

   

  5
  2,7183
  10
  3,1416



Remarquez comment dans ce code, x (sans qualificateur de nom) se réfère à la première :: x alors y fait référence à la seconde :: y, exactement comme nos déclarations using ont spécifié. Nous avons encore accès au premier et deuxième :: y :: x en utilisant leurs noms complets.

Le mot-clé à l'aide peut également être utilisé comme une directive d'introduire un namespace entier:

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24


   

 // using #include <iostream> using namespace std; namespace first { int x = 5; int y = 10; } namespace second { double x = 3.1416; double y = 2.7183; } int main () { using namespace first; cout << x << endl; cout << y << endl; cout << second::x << endl; cout << second::y << endl; return 0; }

   

  5
  10
  3,1416
  2,7183



Dans ce cas, puisque nous avons déclaré que nous utilisions premier espace de noms, tous les usages directs de x et y sans nom qualificatifs faisaient référence à leurs déclarations en premier espace de noms.

l'utilisation et la using namespace valable que dans le même bloc dans lequel elles sont déclarées ou dans l'ensemble du code s'ils sont utilisés directement dans la portée globale. Par exemple, si nous avions l'intention d'utiliser d'abord les objets d'un espace de noms et puis ceux d'une autre, nous pourrions faire quelque chose comme:

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25


   

 // using namespace example #include <iostream> using namespace std; namespace first { int x = 5; } namespace second { double x = 3.1416; } int main () { { using namespace first; cout << x << endl; } { using namespace second; cout << x << endl; } return 0; }

   

  5
  3,1416



alias d'espace de noms

Nous pouvons déclarer d'autres noms pour les espaces de noms existants selon le format suivant:

namespace new_name = current_name;

Namespace std
Tous les fichiers dans la bibliothèque C + + standard de déclarer l'ensemble de ses entités au sein de l'espace de noms std. C'est pourquoi nous avons généralement inclus le using namespace std; déclaration dans tous les programmes qui utilisent une entité définie dans iostream. 
Publié par Drupal Study