Поименованные области в С++
Служат для логического группирования объявлений и ограничения доступа к ним. Чем больше программа, тем более актуально использование поименованных областей. Простейший пример - отделение кода, написанного одним человеком, от кода, написанного другим.
При использовании единственной глобальной области видимости формировать программу из отдельных частей очень сложно из-за возможного совпадения и конфликта имен.
Использование поименованных областей препятствует доступу к ненужным средствам.
Объявление поименованной области (ее называют пространством имен) имеет формат:
Объявление объекта в неименованной области равнозначно его описанию как глобального с модификатором static. Помещать объявления в такую область полезно для того, чтобы сохранить локальность кода. Нельзя получить доступ из одного файла к элементу не-именованной области другого файла.
Пример.
В объявлении поименованной области могут присутствовать как объявления, так и определения. Логично помещать в нее только объявления, а определять их позднее с помощью имени области и оператора доступа к области видимости ::.
Пример:
Имена, объявленные в поименовагнюй области явно или с помощью оператора using, имеют приоритет по отношению к именам, объявленным с помощью оператора using namespace (это имеет значение при включении нескольких поименованных областей, содержащих совпадающие имена).
Короткие имена пространств имен могут войти в конфликт друг с другом, а длинные непрактичны при написании реального кода, поэтому допускается вводить синонимы имен:
Объявление поименованной области (ее называют пространством имен) имеет формат:
namespace [ имя_области ]{ /* Объявления */ }Поименованная область может объявляться неоднократно, причем после-дующие объявления рассматриваются как расширения предыдущих. Таким образом, поименованная область может объявляться и изменяться за рамками одного файла. Если имя области не задано, компилятор определяет его самостоятельно с помощью уникального идентификатора, различного для каждого модуля.
Объявление объекта в неименованной области равнозначно его описанию как глобального с модификатором static. Помещать объявления в такую область полезно для того, чтобы сохранить локальность кода. Нельзя получить доступ из одного файла к элементу не-именованной области другого файла.
Пример.
namespace demo{ int 1 = 1: int к = 0; void funcl(int); void func2(int) { /* ... */ } } namespace demo{ // Расширение // int i = 2; Неверно - двойное определение void fund (double); // Перегрузка void func2(int); // Верно (повторное объявление) }
Пример:
void demo::fund(1nt) { / * ... * / }Это применяется для разделения интерфейса и реализации. Таким способом нельзя объявить новый элемент пространства имен. Объекты, объявленные внутри области, являются видимыми с момента объявления. К ним можно явно обращаться с помощью имени области и оператора доступа к области видимости ::, например:
demo::1 = 100: demo::func2(10);Если имя часто используется вне своего пространства, можно объявить его доступным с помощью оператора using:
using demo::i;После этого можно использовать имя без явного указания области. Если требуется сделать доступными все имена из какой-либо области, используется оператор using namespace:
using namespace demo:Операторы using и using namespace можно использовать и внутри объявления поименованной области, чтобы сделать в ней доступными объявления из другой области:
namespace Department_of_App1ied_Mathematics{ using demo::i; // ... }
Короткие имена пространств имен могут войти в конфликт друг с другом, а длинные непрактичны при написании реального кода, поэтому допускается вводить синонимы имен:
namespace DAM = Department_of__Applied_Mathematics;