C++

Espace de noms C++

Espace de noms C++
Un espace de noms en C++ est une portée généralisée. Sa déclaration commence par le mot réservé, namespace, suivi d'un nom au choix du programmeur, puis du bloc entre accolades. Le bloc contient des déclarations de base et/ou des définitions d'objets, de fonctions et d'autres entités C++.

Considérez les deux instructions scalaires suivantes dans une portée globale, dans le programme suivant :

#inclure
en utilisant l'espace de noms std ;
int varId = 5;
float varId = 2.3 ;
int main()

renvoie 0 ;

Une tentative de compilation de ce programme entraîne une erreur de compilation. Il y a deux variables avec le même nom, varId. Bien qu'il s'agisse de deux variables différentes de deux types différents, entier et flotter, le compilateur rejette les deux déclarations car elles portent le même nom. Le programme suivant résout ce problème en déclarant les variables du même nom dans deux portées généralisées différentes :

#inclure
en utilisant l'espace de noms std ;
espace de noms NA

int varId = 5;

espace de noms NB

float varId = 2.3 ;

int main()

cout << NA::varId << '\n';
cout << NB::varId << '\n';
renvoie 0 ;

La sortie est la suivante :

5
2.3

Il y a deux espaces de noms dans le programme ci-dessus : N / A, qui a la définition d'un entier, et NB, qui a la définition d'un flottant mais avec le même nom que l'entier pour NA. Enfin, lors de l'exécution du programme, le même nom pour deux variables différentes a été utilisé. Notez que pour accéder au même nom de deux variables différentes, le nom particulier de l'espace de noms doit être utilisé, suivi de l'identifiant commun. Le nom de l'espace de noms et l'identifiant commun sont séparés par l'opérateur de résolution de portée, "::.” Le nom des espaces de noms différenciera les objets.

Cet article couvre le concept de base d'un espace de noms et son utilisation dans le langage de programmation C++. Pour suivre cet article, vous devez avoir une connaissance de base du langage C++. Vous devez également avoir une connaissance de la portée C++, bien qu'elle soit brièvement expliquée dans cet article. Pour en savoir plus sur la portée C++, recherchez l'expression « Portée en C++ » (sans les guillemets) dans la zone de recherche de n'importe quel linuxhint.com et appuyez sur Entrée. Cela vous mènera à l'article que cet auteur a écrit.

Contenu de l'article

Qu'est-ce qu'un espace de noms?

Une région déclarative est la plus grande partie d'un programme dans laquelle le nom d'une entité (variable) est valide. Cette région s'appelle une étendue. Un espace de noms en C++ est une portée généralisée dont le but principal est de résoudre les conflits de noms. Un espace de noms a des déclarations de base et/ou des définitions d'entités.

Espace de noms global et son problème

L'espace de noms global est la portée globale. Considérez le programme court suivant :

#inclure
en utilisant l'espace de noms std ;
int ident = 55 ;
identifiant flottant = 12.17 ;
int main()

renvoie 0 ;

Dans le programme ci-dessus, il y a deux variables, toutes deux appelées identifiant. Ces variables sont dans la portée globale ; c'est-à-dire qu'ils sont dans l'espace de noms global. Une tentative de compilation de ce programme échouera avec un message d'erreur. La portée globale n'accepte pas plus d'une variable avec le même nom, il est donc nécessaire d'avoir un espace de noms personnalisé.

Espace de noms personnalisé

Un espace de noms n'a pas qu'un seul nom. Au lieu de cela, un espace de noms a un ensemble de noms pour éviter les conflits avec d'autres ensembles de noms. Pour éviter les conflits plus bas dans le code, faites précéder chaque nom du nom de l'espace de noms et :: . Le programme suivant illustre cela à l'aide de deux espaces de noms personnalisés :

#inclure
en utilisant l'espace de noms std ;
espace de noms NA

int varInt = 6;
flotteur;

espace de noms NB

int varInt = 7 ;
flotteur;

int main()

cout << NA::varInt << '\n';
cout << NB::varInt << '\n';
NA::flt = 2.5 ;
NB::flt = 4.8 ;
cout << NA::flt << '\n';
cout << NB::flt << '\n';
renvoie 0 ;

La sortie est :

6
7
2.5
4.8

Notez que les noms NA::flt et NB::flt ont finalement été définis dans le principale() une fonction. C++ n'autorise pas une telle définition dans la portée globale.

Notez que l'espace de noms personnalisé est un espace de noms imbriqué pour l'espace de noms global.

La directive d'utilisation

Pour éviter de taper « namespace::name » tout le temps au lieu de simplement « name » après avoir déclaré l'espace de noms, vous pouvez utiliser le utilisant directif. La syntaxe pour utiliser le utilisant directive est la suivante :

en utilisant l'espace de noms Namespace_name;

le utilisant La directive n'est pas une directive de préprocesseur, elle se termine donc par un point-virgule (;).

Le programme suivant illustre l'utilisation du utilisant directive et plus :

#inclure
en utilisant l'espace de noms std ;
espace de noms NB

int varInt = 7 ;
fonction int ()

retourne varInt;


entier fn()

en utilisant l'espace de noms NB ;
int maVar2 = func();
//d'autres objets et fonctions de NB suivent.
renvoyer maVar2 ;

int maVar3 = NB::func();
int main()

cout << fn() << " << myVar3 << '\n';
renvoie 0 ;

La sortie de ce programme est 7 7. Le terme "en utilisant l'espace de noms NB ;» a été placé au début de la fn() définition. le fonction() de l'espace de noms NB est appelé juste en dessous, sans précéder de "NB : :."

Une variable déclarée dans la portée globale (espace de noms global) est vue depuis le point de déclaration jusqu'à la fin du fichier. Il est également visible dans les espaces de noms imbriqués (portées imbriquées), tels que le fn() portée de la fonction ci-dessus. le utilisant La directive joint son espace de noms de la position à laquelle elle est placée à la fin de la portée dans laquelle elle est placée.

Le nom fonction() de l'espace de noms NB n'est pas visible sous le fn() définition parce que «en utilisant l'espace de noms NB ; » a été placé dans la portée de la fonction (bloc). A cette condition, utiliser "fonction()" en dehors du bloc d'espace de noms NB (portée), il doit être précédé de "NB : :,» comme dans la déclaration suivante :

int maVar3 = NB::func();

le utilisant La directive joint son espace de noms à l'espace de noms d'imbrication externe à partir de la position à laquelle elle est placée jusqu'à la fin de l'espace de noms d'imbrication externe. Dans le programme suivant, l'espace de noms NA est joint à l'espace de noms global. Les deux espaces de noms s'étendent ensuite dans le fn() espace de noms de définition de fonction, dans lequel ils sont joints à l'espace de noms NB. L'espace de noms NB se termine à la fin du fn() définition de fonction, et les deux espaces de noms précédents continuent jusqu'à la fin du fichier (lire le code).

#inclure
en utilisant l'espace de noms std ;
espace de noms NA

int varInt = 6;
fonction int ()

retourne varInt;


espace de noms NB

int varInt = 7 ;
fonction int ()

retourne varInt;


en utilisant l'espace de noms NA ;
int maVar0 = varInt;
//d'autres objets et fonctions de :: et NB suivent.
entier fn()

int maVar1 = varInt;
en utilisant l'espace de noms NB ;
int maVar2 = NB::func();
//d'autres objets et fonctions de NB suivent, jusqu'à la fin de cette portée.
renvoie maVar1 + maVar2 ;

//Seuls les objets et fonctions de :: et NB suivent.
int maVar3 = NB::func();
int main()

cout << myVar0 << " << fn() << " << myVar3 << '\n';
renvoie 0 ;

La sortie est 6, 13, 7.

Noter: L'espace de noms global est indiqué par :: , ce qui signifie qu'il n'y a rien avant l'opérateur de résolution de portée qui suit.

Sous la déclaration, le "en utilisant l'espace de noms NA ;” les variables des espaces de noms global et NA peuvent être utilisées sans indication de leur espace de noms source. L'instruction suivante utilise le varInt de l'espace de noms NA. La région des espaces de noms combinés global et NA s'étend dans le fn() espace de noms de fonction. Alors le varInt de la première déclaration dans le fn() portée de la fonction, est de l'espace de noms NA.

Étant donné que la région des espaces de noms global et NA s'étend sur tout le fn() champ d'application, après le "int maVar2 = NB::func();,” tout nom de l'espace de noms NB ne peut être utilisé que dans le fn() scope sans le faire précéder de "NB : :,” seulement s'il ne s'est pas produit dans les espaces de noms NA et globaux (blocs). Sinon, il doit être précédé de «NB : :.” La région des espaces de noms combinés pour NA et global continue en dessous de la fn() définition et dans le principale() fonction jusqu'à la fin du fichier.

L'extension de l'espace de noms NB commence à partir de "int maVar2 = NB::func();" dans le fn() bloc et se termine à la fin du fn() bloc de définition.

Noter: Les espaces de noms dont les régions sont jointes ne doivent pas avoir le même nom de variable dans leurs différents blocs d'espaces de noms, car cela provoquerait toujours un conflit.

Régions d'espace de noms

Un espace de noms est une portée. En dehors de l'espace de noms global (portée globale), tout espace de noms doit être déclaré dans un bloc. Ce bloc est la première partie des régions éventuellement distribuées de l'espace de noms. Avec la directive using, l'espace de noms peut être étendu en tant que régions dans d'autres portées.

Les entités déclarées dans un corps d'espace de noms sont dites membres de l'espace de noms, et les noms introduits par ces déclarations dans la région déclarative de l'espace de noms sont dits membres de l'espace de noms.

Espaces de noms imbriqués

Le programme suivant affiche les espaces de noms imbriqués :

#inclure
en utilisant l'espace de noms std ;
espace de noms A

entier je = 1;
espace de noms B

entier i = 2;
espace de noms C

entier i = 3;



int main()

cout << A::i << " << A::B::i << " << A::B::C::i << '\n';
renvoie 0 ;

La sortie est :

1 2 3

Notez que les trois valeurs ont été accédées à l'aide de l'opérateur de résolution de portée.

Espace de noms standard

C++ a une bibliothèque appelée la bibliothèque standard. Les noms des objets, fonctions et autres entités de cette bibliothèque proviennent d'un espace de noms appelé espace de noms standard, écrit sous la forme std. La bibliothèque standard contient des sous-bibliothèques, et l'une de ces sous-bibliothèques est iostream. le iostream la bibliothèque contient l'objet cout, qui sert à envoyer les résultats à la console (terminal).

Le nom cout doit être dans le std espace de noms. Utiliser iostream avec son std namespace, le programme doit être le suivant :

#inclure
en utilisant l'espace de noms std ;

Notez l'utilisation du utilisant directive et std. Le terme "#inclure ” est une directive de préprocesseur et ne se termine pas par un point-virgule. Il inclut le "fichier" iostream à la position de sa directive.

Conclusion

Un espace de noms est une portée. La description (définition) de l'espace de noms contient des déclarations de base et/ou des définitions d'objets, de fonctions et d'autres entités C++. En dehors de la définition de l'espace de noms, le nom est accessible avec la syntaxe, "namespaceName::name.” En dehors de l'espace de noms global (portée globale), tout espace de noms doit être déclaré dans un bloc. Ce bloc est la première partie des régions éventuellement distribuées de l'espace de noms. Avec le utilisant directive, l'espace de noms peut être étendu en tant que régions dans d'autres portées. Les espaces de noms dont les régions sont jointes ne doivent pas avoir le même nom de variable dans leurs différents blocs d'espaces de noms, car cela provoquerait toujours un conflit de noms.

Chrys

Remappez les boutons de votre souris différemment pour différents logiciels avec X-Mouse Button Control
Peut-être que vous avez besoin d'un outil qui pourrait faire changer le contrôle de votre souris avec chaque application que vous utilisez. Si tel est...
Examen de la souris sans fil Microsoft Sculpt Touch
J'ai lu récemment sur le Microsoft Sculpt Touch souris sans fil et j'ai décidé de l'acheter. Après l'avoir utilisé pendant un certain temps, j'ai déci...
Trackpad et pointeur de souris à l'écran AppyMouse pour tablettes Windows
Les utilisateurs de tablettes ratent souvent le pointeur de la souris, surtout lorsqu'ils ont l'habitude d'utiliser les ordinateurs portables. Les sma...