Пространства имен

   
На этом шаге мы рассмотрим использование пространства имен.

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

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

// Определение идентификаторов в пространстве имен 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.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий