Russian Belarusian English German Japanese Ukrainian
  • Главная
  • Определение доступа с помощью объявлений namespace и using

3.25

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

Таким инструментом является объявление области видимости имен ключевым словом namespace и последующее объявление использования функции и переменных из той или иной области ключевым словом using.

Синтаксис объявления области видимости:

namespace имя_области {
объявления типов, переменных и функций
}

Например:

namespace А
{
int i = 1;
void F1(int i)
{
Form1->Label1->Caption = "Область A: i = " + IntToStr(i);
}
}
namespace B
{
int i = 2;
void F1(int i)
{
Form1->Label1->Caption = "Область В: i = " + IntToStr(i);
}
}

Приведенные операторы объявляют две области видимости с именами А и В. В обеих областях объявлены переменные i и функции F1.

Объявление области с тем же именем может повториться в программе и содержать объявления каких-то новых переменных и функций. Соответствующие идентификаторы добавятся в указанную область.

Доступ к объявленным переменным и функциям из любой точки файла может осуществляться несколькими способами. Самый простой - с помощью операции разрешения области действия (::). Например, оператор:

В::F1(A::i);

вызовет функцию F1 из области В и передаст в нее значение переменной i из области А.

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

using namespace имя_области;

Например, если поместить в тексте оператор

using namespace А;

то все последующие операторы будут брать идентификаторы из области А. Тогда, например, размещенный где-то в тексте после using оператор

F1(i);

вызовет функцию F1 из области А и передаст в нее значение переменной i из области А.

Операторы using могут иметь и другую форму, определяющую область для конкретного идентификатора:

using имя_области :: идентификатор;

Например, после операторов

using А::F1;
using В::i;

оператор

F1(i);

вызовет функцию F1 из области А и передаст в нее значение переменной i из области В.

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

namespace A
{
...
}
namespace B
{
using namespace А;
...
namespace С
{
...
}
}

Здесь область В использует ранее объявленную область А и содержит внутри себя вложенную область С. Доступ к вложенным областям осуществляется последовательным применением операции разрешения области действия. Например:

using namespace В :: С;

Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

  Комментарии

+2 Алексей 25.01.2014 19:52 #1
В следующей строке 3 опечатки:
Form1-Mabel1->Caption => "Область A: i = " + IntToStr(i);
должно быть:
Form1->Label1->Caption = "Область A: i = " + IntToStr(i);

Цитата:
Исправлено. Благодарю =)
+10 к карме ;-)

Добавить комментарий


Поиск по сайту