пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Области действия и пространство имён в С++.

Пространство имён — некоторое множество, под которым подразумевается модель, абстрактное хранилище или окружение, созданное для логической группировки уникальных идентификаторов (то есть имён).

Пространство имён определяется блоком инструкций:

namespace foo {
  int bar;
}

Внутри этого блока идентификаторы могут вызываться именно так, как они были объявлены. Но вне блока требуется указание имени пространства имён перед идентификатором. Например, вне namespace foo идентификатор barдолжен указываться как foo::bar. C++ содержит некоторые другие конструкции, делающие подобные требования необязательными. Так, при добавлении строки

using namespace foo;

в код, указывать префикс foo:: больше не требуется. Ещё пример:

namespace Namespace12
{
  int foo=0;
}
 
void func1()
{
  using namespace Namespace12;
  // теперь все имена из пространства имён Namespace12 будут видны здесь без дополнительных префиксов
 
  ++foo;
}
 
void func2()
{
  // а тут имя нужно уточнить:
  Namespace12::foo = 42;
}

Код, не объявленный явным образом в пространстве имён, подразумевается объявленным в глобальном пространстве имён.

Разрешение пространств имён в C++ иерархично. Это означает, что в гипотетическом пространстве имён еда::суп, идентификатор курица будет обозначать еда::суп::курица (если пространство существует). Если не существует, то тогда он указывает на еда::курица (если это пространство существует). Если и это пространство не существует, то курица ссылается на идентификатор в глобальном пространстве.

Зачастую пространства имён в C++ используются для избежания коллизий имён

namespace {
  int a;
  void f() { /*...*/ }
  int g() { /*...*/ }
}

Нельзя осуществить доступ из одной единицы трансляции к члену анонимного пространства имён из другой единицы.

Хотя пространства имён широко используются в современном коде, большая часть старого кода не имеет подобных возможностей. Например, вся стандартная библиотека языка C++ определена внутри namespace std, но до стандартизации многие компоненты первоначально были определены в глобальном пространстве.

Также можно сделать видимым не всё пространство, а отдельные имена внутри него, например:

namespace foo {
  int bar;
  int somelse;
}
int main () {
 using foo::bar; //Делает видимым только bar, somelse невидим!
}
 

хиты: 172
рейтинг:0
Точные науки
информатика
Языки программирования
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь