Рассмотрим ситуацию, когда у нас есть два человека с одним и тем же именем, Зара, в одном классе. Всякий раз, когда нам необходимо их разграничить, нам нужно будет использовать некоторую дополнительную информацию вместе с их названием, например, район, если они живут в другом районе, имя их матери или отца и т. Д.
Такая же ситуация может возникнуть в ваших приложениях C ++. Например, вы можете писать какой-то код, который имеет функцию с именем xyz (), и есть другая доступная библиотека, которая также имеет такую же функцию xyz (). Теперь у компилятора нет возможности узнать, на какую версию функции xyz () вы ссылаетесь в своем коде.
Пространство имен предназначено для преодоления этой трудности и используется в качестве дополнительной информации для разграничения похожих функций, классов, переменных и т. Д. С тем же именем, доступным в разных библиотеках. Используя пространство имен, вы можете определить контекст, в котором определяются имена. По сути, пространство имен определяет область.
Определение пространства имен
Определение пространства имен начинается с ключевого слова 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; }
Если мы скомпилируем и запустим приведенный выше код, это даст следующий результат —