Что такое пространство имен в C++?
Пространство имен (namespace) – это способ объединения логически связанных объявлений под общим именем.
Пример пространства имен:
Получаем:
В примере созданы два пространства имен: first и second. Оба пространства содержат одинаковые переменные. Но именно факт принадлежности, например, переменной a к пространству first не позволяет её спутать с переменной из другого пространства имён. Это позволяет избегать конфликта имен.
Запись
означает, что используется переменная int а, объявленная в пространстве имен first. Это пример using-объявления. Оператор :: называется оператором определения области видимости.
Создаются пространства имен при помощи ключевого слова namespace:
Для того, чтобы использовать все имена из пространства имен можно применить директиву using namespace. Пример использования using namespace std:
using namespace std позволяет использовать имена из пространства имен std. std — это имя стандартной библиотеки C++.
Если в последнем примере убрать строку подключения пространства имен using namespace std, то надо будет указывать наименование пространства имен явно:
Пространство имен определяет область видимости. В примерах явно определялись пространства имён. А вот другие примеры пространств имен. Область видимости внутри функции — это тоже пространство имен. Область видимости глобальных переменных — это тоже пространство имен. Класс — это тоже пространство имен.
Возможно создание пространства имен без имени. Пример:
Здесь подразумевается использование директивы using namespace. Такие пространства имен нужны для ухода от возможного конфликта имен.
Если название пространства имен слишком длинное, то можно создать псевдоним пространства имен. Пример:
Строка
вводит псевдоним ug для пространства имен underground. Далее мы работаем с псевдонимом.
Если предполагается использовать только часть имён из пространства имен, то можно отобрать эту часть в новое пространство имен и использовать его. Пример:
Здесь из пяти переменных пространства имен underground мы предполагаем использовать только две. Создаём новое пространство имен ug, в котором имеются два using-объявления. Далее мы работаем с пространством имен ug.
Пространство имен можно изменить, т.е. дописать в него новые объявления. Пример:
Получаем:
Пространства имен можно вкладывать друг в друга Пример:
Получаем:
В примере namespace upper содержит namespace inner. Обратите внимание, как идёт обращение к полю внутреннего пространства имен:
Рассмотрим глобальное пространство имен. Здесь используют оператор :: без указания имени пространства. В глобальное пространство имен попадают глобальные объявления, включая соответствующие using-директивы. Пример глобального пространства имен:
Важно увидеть разницу между using-объявлениями и using-директивами.
using-объявление делает доступной переменную в локальной области видимости, т.е. происходит локальное объявление имени. Объявить локальную переменную можно двумя путями: обычным или посредством using-объявления.
using-директива делает доступными все имена из данного пространства имен, но не объявляет их локально.
using-объявление имеет приоритет перед using-директивой.
Рассмотрим пример:
Получаем:
Строка
это using-директива, которая делает доступными все имена из пространства имен sbp.
Строка
это работа с локальной переменной а. Чтоб присвоить значения переменной а из пространства sbp, надо явно указать на sbp:
Это же относится и к глобальной переменной а.
Локальная переменная а закрывает глобальные переменные с тем же именем.
Теперь пример для using-объявления:
Получаем:
Строка
это using-объявление. Здесь локально объявляется переменная b из пространства имён sbp. После этого объявления можно проводить действия:
но using-объявление для а
привело бы нас к ошибке, ведь в примере уже определена локальная переменная а.