Unetway

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

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

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

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

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

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

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

Директива по использованию

Вы также можете избежать добавления пространств имен с помощью директивы 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!

Имена, введенные в директиве по use, подчиняются нормальным правилам области. Название видно из точки с use директивы до конца объема , в котором найдена директива. Объекты с тем же именем, которые определены во внешней области, скрыты.

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

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

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

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