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

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

Когда возникают такие сценарии, компилятору становится трудно вывести правильный вызов переменной или функции, что приводит к неоднозначности.

Что такое пространство имен?

Давайте посмотрим на приведенный ниже пример:

Вывод данных:

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

Этот тип ситуаций приводит к неоднозначности в приложениях.

C++ вводит так называемые «namespaces» для решения этой проблемы. Пространство имен в C++ похоже на пакет, область или библиотеку, которые используются для различения переменных или функций с одинаковыми идентификаторами.

Пространство имен может содержать переменные, функции, классы или другие объекты и даже другое пространство имен. На каждого члена пространства имен можно ссылаться, используя пространство имен. Это помогает компилятору различать различные объекты программирования, даже если они имеют одинаковые имена.

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

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

Итак, если нам нужно определить пространство имен с именем «test_space», мы можем сделать это, как показано ниже:

Приведенное выше объявление определяет пространство имен с именем «test_space». Как показано, он имеет целочисленную переменную var в качестве члена.

Доступ к членам пространства имен

Теперь мы определили собственное пространство имен «test_space», но как нам получить доступ к содержимому этого пространства имен?

Читать также:  Лямбда-выражения на C++ с примерами

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

Таким образом, целочисленная переменная var, объявленная в пространстве имен «test_space» выше, может быть доступна следующим образом:

Вот полный пример, который демонстрирует использование пространства имен:

Вывод данных:

Мы продемонстрировали вам создание и доступ к пространству имен в приведенном выше примере программирования. Как вы можете видеть, «test_space» — это пространство имен, которое мы определили. В нем определена одна целочисленная переменная var. Затем в основной функции у нас есть еще одна двойная переменная var, которая инициализируется.

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

Это также решило проблему конфликтов между переменными из-за тех же имен, которые мы обсуждали ранее.

Использование директивы

Как вы уже поняли, мы можем получить доступ к членам пространства имен, используя namespace_name::namespace_member.

Но если мы не хотим указывать имя пространства имен везде в программе, мы можем использовать директиву «using», чтобы включить пространство имен в программу.

Это делается следующим образом:

Вывод данных:

В приведенном выше примере мы использовали два оператора после определения пространства имен «test_space». Вот они:

Первый оператор использует объявление для доступа к пространству имен «std», которое является предопределенным стандартным пространством имен в библиотеке C++. Это пространство имен используется для доступа к различным функциям, таким как cin, cout и т.д.

Второй оператор используется для включения пространства имен «test_space» в программу.

В функции main мы видим, что таким функциям, как cout и переменная var, не обязательно должно предшествовать имя пространства имен. Мы можем напрямую обратиться к ним. Но поскольку имя var конфликтует с локальной переменной в основной функции, мы обращаемся к ней с помощью оператора разрешения области видимости (::), поскольку пространства имен также всегда имеют глобальную область видимости.

Читать также:  Как избежать ошибок в языке Си?

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

C++ также позволяет иметь вложенные пространства имен, т.е. пространство имен, определенное внутри другого пространства имен.

Общий синтаксис вложенных пространств имен следующий:

Если нам нужно получить доступ к ns2_code, то мы можем получить к нему доступ следующим образом:

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

Вывод данных:

Мы использовали вложенные пространства имен в приведенной выше программе. Обратите внимание на способ использования директивы using для доступа к пространствам имен. Недостаточно один раз сослаться только на самое внутреннее пространство имен. Если нам нужен код из самого внешнего пространства имен, нам нужно указать его отдельно.

Мы можем использовать другое имя для пространств имен, известное как «псевдоним». Это особенно полезно при использовании вложенных пространств имен, когда степень вложенности высока.

Мы можем продемонстрировать псевдоним для пространства имен, изменив приведенный выше пример:

Вывод данных:

Обратите внимание на вложенный псевдоним, определенный для пространства имен first::second. Как только псевдоним определен, мы можем обратиться к пространству имен, используя псевдоним.

Внешние пространства имен

Иногда, когда у нас слишком много пространств имен для использования в нашем приложении, мы можем захотеть поместить все пространства имен в отдельный файл. Это можно легко сделать. Когда пространства имен находятся в отдельном файле, мы просто включаем этот файл в нашу программу, а затем напрямую используем пространства имен и его содержимое в нашей программе.

Читать также:  Указатели и операции с указателями в C++

Например, у нас есть файл с именем ns.h, который содержит следующее пространство имен:

Теперь в нашей программе мы можем использовать пространство имен «first» следующим образом:

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

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

C++ также позволяет нам определять то, что называется непрерывными пространствами имен. Непрерывные пространства имен — это пространства имен, которые определены более одного раза, имея одно и то же имя. На самом деле это не отдельные пространства имен, а расширения одного и того же пространства имен.

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

Вывод данных:

Обратите внимание, что в приведенном выше примере мы дважды определили одно и то же пространство имен. В первом определении у нас есть переменная с именем var. В то время как во втором объявлении у нас определено другое пространство имен.

В основной функции мы получили доступ как к членам внешнего, так и к внутреннего пространства имен, и обратите внимание, что к членам легко получить доступ.

Это пример смежных пространств имен, которые иногда также называют «прерывистыми пространствами имен» (discontinuous namespaces). Их определения кажутся отдельными, но на самом деле они представляют собой непрерывные пространства имен.

Итог

На этом мы подошли к концу данной статьи по пространствам имен в C++. Пространства имен позволяют нам разделить наш код на разные пространства, чтобы у нас была ясность при его чтении, а также при использовании его членов.

В нашей следующие статье вы узнаете об операции ввода-вывода файла и функции указателя файла в C++.

С Уважением, МониторБанк

Добавить комментарий