Пространства имен в C ++

Рассмотрим ситуацию, когда у нас есть два человека с одним и тем же именем, Зара, в одном классе. Всякий раз, когда нам нужно различать их определенно, мы должны использовать некоторую дополнительную информацию вместе с их именем, например, либо район, если они живут в другом районе, либо имя их матери или отца и т.

Такая же ситуация может возникнуть в ваших приложениях на C ++. Например, вы можете писать код, который имеет функцию с именем xyz (), и есть другая доступная библиотека, которая также имеет такую ​​же функцию xyz (). Теперь компилятор не может узнать, на какую версию функции xyz () вы ссылаетесь в своем коде.

А namespaceпредназначен для преодоления этой трудности и используется в качестве дополнительной информации для различения похожих функций, классов, переменных и т. д. с одинаковыми именами, доступных в разных библиотеках. Используя пространство имен, вы можете определить контекст, в котором определены имена. По сути, пространство имен определяет область видимости.

Определение пространства имен

Определение пространства имен начинается с ключевого слова namespace за которым следует имя пространства имен следующим образом -

namespace namespace_name {
   // code declarations
}

Чтобы вызвать версию функции или переменной с включенным пространством имен, добавьте (: :) к имени пространства имен следующим образом:

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

Давайте посмотрим, как пространство имен охватывает объекты, включая переменную и функции -

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

Если мы скомпилируем и запустим приведенный выше код, это даст следующий результат:

Inside first_space
Inside second_space

Директива using

Вы также можете избежать добавления пространств имен с помощью using namespaceдиректива. Эта директива сообщает компилятору, что последующий код использует имена в указанном пространстве имен. Таким образом, пространство имен подразумевается для следующего кода -

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

Если мы скомпилируем и запустим приведенный выше код, это даст следующий результат:

Inside first_space

Директива using также может использоваться для ссылки на конкретный элемент в пространстве имен. Например, если единственная часть пространства имен std, которую вы собираетесь использовать, - это cout, вы можете ссылаться на нее следующим образом:

using std::cout;

Последующий код может ссылаться на cout без добавления пространства имен, но другие элементы в std пространство имен по-прежнему должно быть явным:

#include <iostream>
using std::cout;

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

Если мы скомпилируем и запустим приведенный выше код, это даст следующий результат:

std::endl is used with std!

Имена введены в usingдиректива подчиняется нормальным правилам области видимости. Имя видно с точкиusingдиректива до конца области, в которой находится директива. Сущности с тем же именем, определенные во внешней области видимости, скрыты.

Несмежные пространства имен

Пространство имен может быть определено в нескольких частях, поэтому пространство имен состоит из суммы его отдельно определенных частей. Отдельные части пространства имен могут быть распределены по нескольким файлам.

Итак, если для одной части пространства имен требуется имя, определенное в другом файле, это имя все равно должно быть объявлено. Написание следующего определения пространства имен либо определяет новое пространство имен, либо добавляет новые элементы к существующему -

namespace namespace_name {
   // code declarations
}

Вложенные пространства имен

Пространства имен могут быть вложенными, где вы можете определить одно пространство имен внутри другого пространства имен следующим образом:

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

Вы можете получить доступ к членам вложенного пространства имен, используя следующие операторы разрешения:

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

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

В приведенных выше операторах, если вы используете namespace_name1, тогда он сделает элементы namespace_name2 доступными в области следующим образом:

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

Если мы скомпилируем и запустим приведенный выше код, это даст следующий результат:

Inside second_space