На этом шаге мы рассмотрим использование пространства имен.
С появлением новых библиотек, модулей и компонентов возрастает вероятность конфликтов имен при их одновременном использовании. Пространства имен помогают решить эту проблему.
Пространство имен объединяет идентификаторы в именованной области видимости. При этом имя пространства является единственным глобальным идентификатором, который может конфликтовать с другими глобальными именами. По аналогии с членами классов идентификаторы, входящие в пространство имен, уточняются именем этого пространства с оператором ::, как показано ниже:
// Определение идентификаторов в пространстве имен josuttis namespace josuttis { class File; void myGlobalFunc(); . . . . } . . . . // Использование идентификатора, входящего в пространство имен josuttis::File obj: . . . . josuttis::myGlobalFunc();
В отличие от классов пространства имен открыты для новых определений и расширений. Следовательно, пространства имен могут использоваться для определения модулей, библиотек или компонентов, причем даже в разных файлах. Пространства имен определяют логические, а не физические модули.
Если какие-либо типы аргументов определены в пространстве имен, в котором определена функция, то при вызове функции уточнять пространство имен не обязательно. Пример:
// Определение идентификаторов в пространстве имен josuttis namespace josuttis { class File; void myGlobalFunc( const File&); . . . . } . . . . josuttis::File obj: . . . . myGlobalFunc(obj): // Функция josuttis:myGlobalFunc будет успешно найдена
Объявление using помогает избежать утомительных многократных повторений уточняющего префикса. Например, следующее объявление означает, что в текущей области видимости идентификатор File является локальным синонимом для josuttis::File:
using josuttis::File;
С другой стороны, директива using открывает доступ ко всем именам заданного пространства имен так, как если бы они были объявлены за его пределами. Это может привести к возникновению обычных конфликтов. Например, представленная ниже директива делает идентификаторы File и myGlobalFunc() глобальными в текущей области видимости:
using namespace josuttis;
Если в глобальной области видимости уже существуют идентификаторы File или myGlobalFunc(), то при использовании имен из пространства josuttis без уточняющих префиксов компилятор сообщает о неоднозначности ссылки.
Никогда не используйте директиву using при отсутствии полной информации о контексте (например, в заголовочных файлах, модулях или библиотеках). Директива может изменить область видимости идентификаторов в пространстве имен, что приведет к нарушению работы программы при включении или использовании программного кода другого модуля. Вообще говоря, присутствие директив using в заголовочных файлах считается признаком плохого проектирования.
В библиотеке STL все идентификаторы определяются в пространстве имен std.
На следующем шаге мы рассмотрим использование типа bool.