
- •5.Препроцессор. Директивы препроцессора.
- •7.Работа с файлами. Текстовый и двоичный режим.
- •8.Указатели. Адресная арифметика.
- •10.Перечислимый тип. Структуры. Объединения.
- •11.Поразрядные операции.
- •13.Спецификаторы класса памяти.
- •14.Пространства имён.
- •15.Компоновка. Правило одного определения.
- •16.Понятие класса.
- •17.Функции-члены класса. Указатель this.
- •18.Конструкторы. Деструкторы.
- •19.Преобразования объектов класса.
- •20.Доступ к членам класса.
- •21.Статические члены класса.
- •22.Друзья класса.
- •23.Совместное использование.
- •24.Перегрузка операций.
- •25.Шаблоны.
- •26.Обработка исключительных ситуаций.
- •27.Производные классы.
- •28.Виртуальные функции. Абстрактные классы.
- •29.Указатели на члены класса.
- •30.Множественное наследование.
- •31.Структура dll-библиотеки.
- •32.Статическое и динамическое подключение dll-библиотек.
- •34.Регистры процессора.
- •35.Использование стека. Команды работы со стеком в языке ассемблера.
- •36.Арифметические команды в языке ассемблера.
- •37.Команды сравнения и перехода в языке ассемблера.
- •38.Команды работы с битами в языке ассемблера.
- •39.Процедуры в языке ассемблера. Передача параметров в процедуру.
- •40.Процедуры в языке ассемблера. Возврат результата. Локальные данные.
14.Пространства имён.
Пространство имён является механизмом отражения логического группирования. То есть если некоторые объявления можно объединить по какому-либо критерию, их можно поместить в одно пространство имён для отражения этого факта.Пространство имён объявляется следующим образом: namespace <имя пространства имён> { <объявления и определения> }
Нельзя объявить новый член пространства имён вне его определения, используя явный квалификатор. Это делается для того, чтобы можно было найти все имена в определении пространства имён и быстро выявить такие ошибки, как опечатки и несоответствие типов.
Пространство имён является областью видимости. Обычные локальные и глобальные области видимости и классы являются пространствами имён. Обычные правила областей видимости применимы и к пространствам имён. Если имя предварительно объявлено в пространстве имён или в охватывающей области, дальше его можно использовать без проблем. Имя из другого пространства имён можно использовать при помощи явного указания этого пространства в качестве квалификатора.
Объявления using Если имя часто используется вне пределов своего пространства имён, неудобно каждый раз использовать квалификатор. Для того чтобы избежать этого, используются объявления using, которые вводят локальные синонимы.Такие синонимы следует делать как можно более локальными во избежание конфликтов имён.Единственное объявление using делает видимыми все версии перегруженной функции.
namespace N2 { ... using N1::g; }
Директива using делает доступными все имена из пространства имён.
namespace N2 { ... using namespace N1; } Можно считать, что директива using является средством композиции пространств имён. В функциях директива using используется для удобства записи. Однако использования глобальных директив using лучше по возможности избегать.
Неименованные пространства имён Иногда полезно помещать объявления в пространство имён для того, чтобы исключить возможность конфликта имён. В этом случае можно использовать неименованные пространства имён.
Namespace { void f() { ... } void g() { ... } ... } Ясно, что должен существовать способ доступа к членам неименованного пространства имён. Следовательно, неименованное пространство имён подразумевает использование директивы using.
namespace XXX { void f() { ... } void g() { ... } ... } using namespace XXX; Здесь XXX является некоторым уникальным именем, которое даётся пространству имён компилятором и не известно программисту. Неименованные пространства имён в разных единицах компиляции различны. Нельзя осуществить доступ из одной единицы компиляции к члену неименованного пространства имён из другой единицы компиляции.
Поиск имён Является скорее правилом, чем исключением, что функция с параметром типа Т определяется в том же пространстве имён, что и Т. Поэтому, если функция не найдена в контексте её использования, осуществляется поиск в пространстве имён её параметров.
namespace NS1 { class X { ... }; void f(const X &x); } void g(NS1::X x) { f(x); } По сравнению с использованием явных квалификаторов это правило поиска имён экономит время при вводе программы и не приводит к «загрязнению» пространства имён, как это может сделать директива using.
Псевдонимы пространств имён Короткие названия пространств имён могут войти в конфликт друг с другом. Однако, длинные названия пространств имён непрактичны при написании реального кода. Эту дилемму можно решить путём создания короткого псевдонима длинного названия пространства имён. namespace RFBR = Russian_Fund_of_Basic_Researches;Псевдонимы, кроме того, позволяют пользователю ссылаться на «библиотеку» и в одном единственном объявлении определять реально используемую библиотеку.
Это может значительно облегчить проблему смены версии библиотеки.
Объединение и отбор Комбинация объединения пространств имён при помощи директив using и отбора при помощи объявлений using обеспечивает гибкость, требуемую для большинства реальных задач. Используя эти механизмы, мы можем обеспечить доступ ко множеству средств таким образом, чтобы разрешать конфликты имён и неоднозначности, возникающие из-за объединения.Имена, явно объявленные в пространстве имён, включая имена, объявленные с помощью объявленийusing, имеют приоритет по отношению к именам, сделанным доступными при помощи директив using. Поэтому конфликты будут разрешать в пользу One::Vector и Two::Matrix. Кроме того, All::List будет использоваться по умолчанию, независимо от того, имеется ли List в пространстве One или пространстве Two.