Учебники

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

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

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

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

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

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

namespace namespace_name {
   // code declarations
}

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

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

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

Live Demo

#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 . Эта директива сообщает компилятору, что последующий код использует имена в указанном пространстве имен. Таким образом, пространство имен подразумевается для следующего кода:

Live Demo

#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 по- прежнему должны быть явными, как показано ниже:

Live Demo

#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 доступными в области видимости следующим образом:

Live Demo

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

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