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

C Namespace



Пространство имен в C ++ - это обобщенная область видимости. Его объявление начинается с зарезервированного слова namespace, за которым следует имя по выбору программиста, а затем блок в фигурных скобках. Блок содержит базовые объявления и / или определения объектов, функций и других сущностей C ++.

Рассмотрим следующие два скалярных оператора в глобальной области в следующей программе:







#включают
используя пространство имен std;

intvarIdзнак равно 5;
плаватьvarIdзнак равно 2.3;

intглавный()
{

возвращение 0;
}

Попытка скомпилировать эту программу приводит к ошибке компиляции. Есть две переменные с одинаковым именем, varId . Хотя это две разные переменные двух разных типов, int а также плавать , компилятор отклоняет два объявления, потому что они имеют одно и то же имя. Следующая программа решает эту проблему, объявляя переменные с одинаковыми именами в двух разных обобщенных областях:



#включают
используя пространство имен std;

пространство имен NA
{
intvarIdзнак равно 5;
}

пространство имен NB
{
плаватьvarIdзнак равно 2.3;
}

intглавный()
{
Стоимость<<NA::varId << ' п';
Стоимость<<NB::varId << ' п';

возвращение 0;
}

Результат выглядит следующим образом:



5
2.3

В приведенной выше программе есть два пространства имен: NA , который имеет определение целого числа, и NB , который имеет определение числа с плавающей запятой, но с тем же именем, что и целое число для NA. Наконец, при запуске программы использовалось одно и то же имя для двух разных переменных. Обратите внимание, что для доступа к одному и тому же имени двух разных переменных необходимо использовать конкретное имя для пространства имен, за которым следует общий идентификатор. Имя пространства имен и общий идентификатор разделяются оператором разрешения области видимости, :: . Имя пространств имен будет различать объекты.





В этой статье рассматривается основная концепция пространства имен и его использование в языке программирования C ++. Чтобы следовать этой статье, вы должны иметь базовые знания языка C ++. Вы также должны знать область действия C ++, хотя она кратко объясняется в этой статье. Чтобы узнать больше о области действия C ++, найдите фразу Scope в C ++ (без кавычек) в поле поиска любой веб-страницы linuxhint.com и нажмите Enter. Это приведет вас к статье, написанной этим автором.

Содержание статьи

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

Декларативная область - это самая большая часть программы, в которой допустимо имя объекта (переменной). Эта область называется областью действия. Пространство имен в C ++ - это обобщенная область видимости, основной целью которой является разрешение конфликтов имен. Пространство имен имеет базовые объявления и / или определения сущностей.



Глобальное пространство имен и его проблема

Глобальное пространство имен - это глобальная область видимости. Рассмотрим следующую короткую программу:

#включают
используя пространство имен std;

intИдентификаторзнак равно 55;
плаватьИдентификаторзнак равно 12,17;

intглавный()
{

возвращение 0;
}

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

Пользовательское пространство имен

Пространство имен не имеет только одного имени. Вместо этого пространство имен имеет набор имен, чтобы избежать конфликта с другими наборами имен. Чтобы избежать конфликта ниже в коде, перед каждым именем ставьте имя пространства имен и :: . Следующая программа иллюстрирует это с помощью двух настраиваемых пространств имен:

#включают
используя пространство имен std;

пространство имен NA
{
intvarIntзнак равно 6;
плаватьflt;
}

пространство имен NB
{
intvarIntзнак равно 7;
плаватьflt;
}

intглавный()
{
Стоимость<<NA::varInt << ' п';
Стоимость<<NB::varInt << ' п';
NA::flt знак равно 2,5;
NB::flt знак равно 4.8;
Стоимость<<NA::flt << ' п';
Стоимость<<NB::flt << ' п';

возвращение 0;
}

Результат:

6
7
2,5
4.8

Обратите внимание, что имена NA :: flt а также NB :: flt в конечном итоге были определены в главный() функция. C ++ не допускает такого определения в глобальной области видимости.

Обратите внимание, что настраиваемое пространство имен является вложенным пространством имен для глобального пространства имен.

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

Чтобы не вводить все время namepace :: name вместо просто name после объявления пространства имен, вы можете использовать с использованием директива. Синтаксис для использования с использованием директива выглядит следующим образом:

с использованием пространства имен Namespace_name;

В с использованием Директива не является директивой препроцессора, поэтому заканчивается точкой с запятой (;).

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

#включают
используя пространство имен std;

пространство имен NB
{
intvarIntзнак равно 7;
intфункция()
{
возвращениеvarInt;
}
}

intfn()
{
с использованием пространства имен NB;
intmyVar2знак равнофункция();
// далее следуют другие объекты и функции из NB.
возвращениеmyVar2;
}

intmyVar3знак равноNB::функция();

intглавный()
{
Стоимость<<fn() << '' <<myVar3<< ' п';

возвращение 0;
}

Результатом этой программы будет 7 7 . Срок с использованием пространства имен NB; был помещен в начало fn () определение. В func () из пространства имен NB вызывается чуть ниже этого, без предшествующего NB :: .

Переменная, объявленная в глобальной области (глобальном пространстве имен), просматривается от точки объявления до конца файла. Это также видно во вложенных пространствах имен (вложенных областях), таких как вложенные fn () объем функции выше. В с использованием Директива присоединяется к своему пространству имен от позиции, в которой она размещена, до конца области, в которой она размещена.

Имя func () из пространства имен NB не отображается под fn () определение, потому что с использованием пространства имен NB; был помещен в область действия функции (блок). При этом условии, чтобы использовать func () вне блока (области) пространства имен NB, ему должен предшествовать NB :: , как в следующем заявлении:

intmyVar3знак равноNB::функция();

В с использованием Директива объединяет свое пространство имен с внешним пространством имен вложенности от позиции, в которой она размещена, до конца внешнего пространства имен вложенности. В следующей программе пространство имен NA объединено с глобальным пространством имен. Оба пространства имен затем расширяются в fn () пространство имен определения функции, в котором они объединены с пространством имен NB. Пространство имен NB заканчивается в конце fn () определение функции, и два предыдущих пространства имен продолжаются до конца файла (считывается через код).

#включают
используя пространство имен std;

пространство имен NA
{
intvarIntзнак равно 6;
intфункция()
{
возвращениеvarInt;
}

}

пространство имен NB
{
intvarIntзнак равно 7;
intфункция()
{
возвращениеvarInt;
}
}

с использованием пространства имен NA;
intmyVar0знак равноvarInt;
// далее следуют другие объекты и функции из :: и NB.

intfn()
{
intmyVar1знак равноvarInt;
с использованием пространства имен NB;
intmyVar2знак равноNB::функция();
// другие объекты и функции из NB следуют до конца этой области.
возвращениеmyVar1+myVar2;
}

// Следуют только объекты и функции из :: и NB.

intmyVar3знак равноNB::функция();

intглавный()
{
Стоимость<<myVar0<< '' <<fn() << '' <<myVar3<< ' п';

возвращение 0;
}

На выходе 6, 13, 7 .

Примечание: Глобальное пространство имен обозначено :: , что означает, что перед последующим оператором разрешения области нет ничего.

Под заявлением с использованием пространства имен NA; переменные из глобального пространства имен и пространства имен NA могут использоваться без указания их исходного пространства имен. В следующем заявлении используется varInt пространства имен NA. Область объединенного пространства имен global и NA простирается на fn () пространство имен функции. Так что varInt первого заявления в fn () область действия функции принадлежит пространству имен NA.

Поскольку регион для пространств имен global и NA простирается на fn () масштабы, после int myVar2 = NB :: func (); , любое имя из пространства имен NB можно использовать только в fn () объем без предшествующего ему NB :: , только если это не произошло в NA и глобальных пространствах имен (блоках). В противном случае ему должно предшествовать NB :: . Область объединенных пространств имен для NA и global продолжается ниже fn () определение и в главный() функция до конца файла.

Расширение пространства имен NB начинается с int myVar2 = NB :: func (); в fn () блок и заканчивается в конце fn () блок определения.

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

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

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

Объекты, объявленные в теле пространства имен, называются членами этого пространства имен, а имена, введенные этими объявлениями в декларативную область пространства имен, называются именами членов этого пространства имен.

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

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

#включают
используя пространство имен std;

пространство имен A
{
intязнак равно 1;
пространство имен B
{
intязнак равно 2;
пространство имен C
{
intязнак равно 3;
}
}
}

intглавный()
{
Стоимость<<К::я << '' <<К::B::я << '' <<К::B::C::я << ' п';

возвращение 0;
}

Результат:

1 2 3

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

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

В C ++ есть библиотека, называемая стандартной библиотекой. Имена объектов, функций и других сущностей в этой библиотеке взяты из пространства имен, называемого стандартным пространством имен, записанного как часы . Стандартная библиотека содержит подбиблиотеки, и одна из этих подбиблиотек iostream . В iostream библиотека содержит объект Стоимость , который используется для отправки результатов на консоль (терминал).

Имя Стоимость должен быть в часы пространство имен. Использовать iostream с этими часы пространство имен, программа должна быть следующей:

#включают
используя пространство имен std;

Обратите внимание на использование с использованием директива и часы . Срок #включают является директивой препроцессора и не заканчивается точкой с запятой. Он включает файл iostream в позиции своей директивы.

Заключение

Пространство имен - это область видимости. Описание (определение) пространства имен содержит базовые объявления и / или определения объектов, функций и других сущностей C ++. Вне определения пространства имен доступ к имени можно получить с помощью синтаксиса, namespaceName :: имя . Помимо глобального пространства имен (глобальная область видимости), любое пространство имен должно быть объявлено в блоке. Этот блок является первой частью возможных распределенных областей пространства имен. С с использованием директиве пространство имен может быть расширено как регионы в других областях. Пространства имен, регионы которых соединяются, не должны иметь одинаковые имена переменных в разных блоках пространств имен, так как это все равно вызовет конфликт имен.

Chrys