ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4282
Скачиваний: 28
Часть II. Язык программирования С++
156
пространство имен
MyNames
можно расширить в другом исходном
файле:
namespace MyNames
{
int n;
int sub(int a, int b);
}
Пространства имен могут быть вложенными друг в друга. На-
пример:
namespace PublicNames
{
int n;
namespace MyNames
{
int add(int a, int b) { return a + b; }
}
}
12.2. Анонимные пространства имен
По умолчанию существует анонимное пространство имен, кото-
рое доступно во всех исходных файлах и которое не нужно объ-
являть. Это пространство имен называется
глобальным
. Можно
сказать, что все пространства имен вложены в глобальное про-
странство имен. Все имена, которые не входят ни в одно про-
странство имен, по умолчанию принадлежат глобальному про-
странству имен.
Имена из заголовочных файлов, которые имеют расширение h,
принадлежат глобальному пространству имен.
В каждом исходном файле также можно объявить
локальное ано-
нимное пространство имен
, которое видимо только в этом фай-
ле. Это пространство имен объявляется следующим образом:
namespace
{
// тело пространства имен
}
Глава 12. Пространства имен
157
Локальное анонимное пространство имен может быть вложено в
другое именованное пространство имен. Например:
namespace MyNames
{
namespace
{
int add(int a, int b) { return a + b; }
}
}
12.3. Стандартное пространство имен
По умолчанию в языке программирования С++ существует про-
странство имен
std
, которое называется
стандартным
. Имена из
заголовочных файлов, которые не имеют расширения, принадле-
жат стандартному пространству имен.
В листинге 12.1 приведен пример использования имен из стан-
дартного пространства
std
. Как видно, в этом случае нужно ис-
пользовать оператор разрешения области видимости, который
будет рассмотрен в следующем разделе.
Листинг 12.1. Использование имен из стандартного
пространства
std
#include <iostream>
int main()
{
std::cout << "Hello word" << std::endl;
return 0;
}
12.4. Оператор разрешения
области видимости
Для доступа к именам пространства имен используется оператор
разрешения области видимости
::
, который имеет следующий
синтаксис:
имя_пространства_имен::имя_объекта
Часть II. Язык программирования С++
158
В этом случае имя пространства имен называется
квалифика-
тором имени объекта
. При этом отметим, что оператор разреше-
ния области видимости выполняется на этапе компиляции про-
граммы и не влияет на ее производительность. Этот оператор ас-
социативен справа налево и имеет наивысший приоритет из всех
операторов.
В листинге 12.2 приведен пример доступа к именам при помощи
оператора разрешения области видимости.
Листинг 12.2. Доступ к именам при помощи оператора разрешения
области видимости
#include <iostream>
namespace MyNames
{
int n, m;
int add(int a, int b) { return a + b; }
}
int main()
{
int sum;
MyNames::n = 2;
MyNames::m = 3;
sum = MyNames::add(MyNames::n, MyNames::m);
std::cout << sum << std::endl; // печатает 5
return 0;
}
Для доступа к именам из глобального пространства имен исполь-
зуется оператор разрешения области видимости без квалифика-
тора. Это необходимо в случае, если глобальные имена скрыты
локальными именами из не глобальной области видимости.
В листинге 12.3 приведен пример доступа к именам из глобаль-
ного пространства имен.
Листинг 12.3. Доступ к именам из глобального пространства имен
#include <iostream>
int n = 10;
Глава 12. Пространства имен
159
namespace MyNames
{
int add(int n) { return n + ::n; }
}
int main()
{
int n = 5;
int m = MyNames::add(n);
std::cout << m << std::endl; // печатает 15
return 0;
}
Для доступа к именам из локального анонимного пространства
оператор разрешения области видимости не используется.
В листинге 12.4 приведен пример доступа к именам из локально-
го анонимного пространства имен.
Листинг 12.4. Доступ к именам из локального
анонимного пространства имен
#include <iostream>
int n = 10;
namespace
{
int add(int n) { return n + ::n; }
}
int main()
{
int n = 5;
int m = add(n);
std::cout << m << std::endl; // печатает 15
return 0;
}
Имя переменной, принадлежащее локальному анонимному про-
странству имен, может быть недоступно в другом пространстве
Часть II. Язык программирования С++
160
имен. Это происходит в том случае, если это имя скрыто именем
глобальной или локальной переменной.
В листинге 12.5 приведен пример неоднозначного определения
имени переменной в локальном анонимном пространстве имен.
Листинг 12.5. Неоднозначное определение переменной
#include <iostream>
int n = 10;
namespace
{
int n = 20;
}
int main()
{
int m = n; // ошибка компиляции: n - неоднозначный символ
std::cout << m << std::endl;
return 0;
}
12.5. Объявление
using
Для объявления имени из некоторого пространства имен исполь-
зуется объявление
using
, которое может находиться в любой об-
ласти видимости, включая область видимости любого простран-
ства имен. Объявление
using
имеет следующий синтаксис:
using имя_пространства_имен имя_объекта;
В листинге 12.6 приведен пример использования объявления
using
.
Листинг 12.6. Использование объявления
using
#include <iostream>
using std::cout;
int main()