Namespace в C++

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

Пространство имен (namespace) – это способ объединения логически связанных объявлений под общим именем.

Пример пространства имен:

Получаем: Пространство имен

В примере созданы два пространства имен: first и second. Оба пространства содержат одинаковые переменные. Но именно факт принадлежности, например, переменной a к пространству first не позволяет её спутать с переменной из другого пространства имён. Это позволяет избегать конфликта имен.

Запись

first::a = 1;

означает, что используется переменная int а, объявленная в пространстве имен first. Это пример using-объявления. Оператор :: называется оператором определения области видимости.

Создаются пространства имен при помощи ключевого слова namespace:

Для того, чтобы использовать все имена из пространства имен можно применить директиву using namespace. Пример использования using namespace std:

using namespace std позволяет использовать имена из пространства имен std. std — это имя стандартной библиотеки C++.

Если в последнем примере убрать строку подключения пространства имен using namespace std, то надо будет указывать наименование пространства имен явно:

Пространство имен определяет область видимости. В примерах явно определялись пространства имён. А вот другие примеры пространств имен. Область видимости внутри функции — это тоже пространство имен. Область видимости глобальных переменных — это тоже пространство имен. Класс — это тоже пространство имен.

Возможно создание пространства имен без имени. Пример:

Здесь подразумевается использование директивы using namespace. Такие пространства имен нужны для ухода от возможного конфликта имен.

Если название пространства имен слишком длинное, то можно создать псевдоним пространства имен. Пример:

Строка

namespace ug = underground;

вводит псевдоним ug для пространства имен underground. Далее мы работаем с псевдонимом.

Если предполагается использовать только часть имён из пространства имен, то можно отобрать эту часть в новое пространство имен и использовать его. Пример:

Здесь из пяти переменных пространства имен underground мы предполагаем использовать только две. Создаём новое пространство имен ug, в котором имеются два using-объявления. Далее мы работаем с пространством имен ug.

Пространство имен можно изменить, т.е. дописать в него новые объявления. Пример:

Получаем: namespace

Пространства имен можно вкладывать друг в друга Пример:

Получаем: namespace

В примере namespace upper содержит namespace inner. Обратите внимание, как идёт обращение к полю внутреннего пространства имен:

upper::inner::c = 1.2;

Рассмотрим глобальное пространство имен. Здесь используют оператор :: без указания имени пространства. В глобальное пространство имен попадают глобальные объявления, включая соответствующие using-директивы. Пример глобального пространства имен:

Важно увидеть разницу между using-объявлениями и using-директивами.
using-объявление делает доступной переменную в локальной области видимости, т.е. происходит локальное объявление имени. Объявить локальную переменную можно двумя путями: обычным или посредством using-объявления.

using-директива делает доступными все имена из данного пространства имен, но не объявляет их локально.

using-объявление имеет приоритет перед using-директивой.

Рассмотрим пример:

Получаем: namespace-using

Строка

using namespace sbp;

это using-директива, которая делает доступными все имена из пространства имен sbp.

Строка

a = 1;

это работа с локальной переменной а. Чтоб присвоить значения переменной а из пространства sbp, надо явно указать на sbp:

sbp::a = 2;

Это же относится и к глобальной переменной а.

Локальная переменная а закрывает глобальные переменные с тем же именем.

Теперь пример для using-объявления:

Получаем: using-объявления

Строка

using sbp::b;

это using-объявление. Здесь локально объявляется переменная b из пространства имён sbp. После этого объявления можно проводить действия:

b = 2;

но using-объявление для а

using sbp::a;

привело бы нас к ошибке, ведь в примере уже определена локальная переменная а.