Espaces de noms en C ++

Prenons une situation où nous avons deux personnes du même nom, Zara, dans la même classe. Chaque fois que nous devons les différencier définitivement, nous devrons utiliser des informations supplémentaires avec leur nom, comme la région, s'ils vivent dans une région différente ou le nom de leur mère ou de leur père, etc.

La même situation peut se produire dans vos applications C ++. Par exemple, vous pourriez écrire du code qui a une fonction appelée xyz () et il y a une autre bibliothèque disponible qui a également la même fonction xyz (). Maintenant, le compilateur n'a aucun moyen de savoir à quelle version de la fonction xyz () vous faites référence dans votre code.

UNE namespaceest conçu pour surmonter cette difficulté et est utilisé comme information supplémentaire pour différencier des fonctions similaires, des classes, des variables, etc. avec le même nom disponible dans différentes bibliothèques. À l'aide de l'espace de noms, vous pouvez définir le contexte dans lequel les noms sont définis. En substance, un espace de noms définit une portée.

Définition d'un espace de noms

Une définition d'espace de noms commence par le mot-clé namespace suivi du nom de l'espace de noms comme suit -

namespace namespace_name {
   // code declarations
}

Pour appeler la version activée pour l'espace de noms de la fonction ou de la variable, ajoutez (: :) le nom de l'espace de noms comme suit -

name::code;  // code could be variable or function.

Voyons comment l'espace de noms couvre les entités, y compris la variable et les fonctions -

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

Si nous compilons et exécutons le code ci-dessus, cela produirait le résultat suivant -

Inside first_space
Inside second_space

La directive using

Vous pouvez également éviter l'ajout des espaces de noms avec le using namespacedirectif. Cette directive indique au compilateur que le code suivant utilise des noms dans l'espace de noms spécifié. L'espace de noms est donc impliqué pour le code suivant -

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

Si nous compilons et exécutons le code ci-dessus, cela produirait le résultat suivant -

Inside first_space

La directive 'using' peut également être utilisée pour faire référence à un élément particulier dans un espace de noms. Par exemple, si la seule partie de l'espace de noms std que vous avez l'intention d'utiliser est cout, vous pouvez vous y référer comme suit:

using std::cout;

Le code suivant peut faire référence à cout sans ajouter au début de l'espace de noms, mais d'autres éléments dans le std l'espace de noms devra toujours être explicite comme suit -

#include <iostream>
using std::cout;

int main () {
   cout << "std::endl is used with std!" << std::endl;
   
   return 0;
}

Si nous compilons et exécutons le code ci-dessus, cela produirait le résultat suivant -

std::endl is used with std!

Noms introduits dans un usingdirective obéissent aux règles de portée normales. Le nom est visible du point de lausingdirective à la fin du champ d’application dans lequel se trouve la directive. Les entités portant le même nom défini dans une portée externe sont masquées.

Espaces de noms non contigus

Un espace de noms peut être défini en plusieurs parties et donc un espace de noms est constitué de la somme de ses parties définies séparément. Les parties distinctes d'un espace de noms peuvent être réparties sur plusieurs fichiers.

Ainsi, si une partie de l'espace de noms nécessite un nom défini dans un autre fichier, ce nom doit toujours être déclaré. L'écriture d'une définition d'espace de noms suivante définit un nouvel espace de noms ou ajoute de nouveaux éléments à un espace existant -

namespace namespace_name {
   // code declarations
}

Espaces de noms imbriqués

Les espaces de noms peuvent être imbriqués où vous pouvez définir un espace de noms dans un autre espace de noms comme suit -

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

Vous pouvez accéder aux membres de l'espace de noms imbriqué à l'aide des opérateurs de résolution comme suit -

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

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

Dans les instructions ci-dessus, si vous utilisez namespace_name1, les éléments de namespace_name2 seront disponibles dans la portée comme suit -

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

Si nous compilons et exécutons le code ci-dessus, cela produirait le résultat suivant -

Inside second_space