Программирование >>  Дополнительные возможности наследования 

1 ... 176 177 178 [ 179 ] 180 181 182 ... 265


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

namespace Window { int valuel = 20 ;

, .

using namespace Window ; int valuel = 10 ; void f( ) {

valuel = 10 ;

В данном примере неопределенность возникает внутри функции f(). Оператор using сообщает переменной Window: :value1 глобальную область видимости. Однако в программе объявляется другая глобальная переменная с таким же именем. Какая из них используется в функции f()? Обратите внимание, что ошибка будет показана не во время объявления одноименной глобальной переменной, а при обращении к ней в теле функции f().

Использование using в объявлениях

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

namespace Window {

Int valuel = 20

int value2 = 40

int values = 60 }

. . .

using Window::value2 ; открытие доступа к value2 в текущем модуле Window::valuo1 = 10 ; для valuel необходимо указание пространства имен value2 = 30 ;

Window::value3 = 10 ; для value3 необходимо указание пространства имен

Итак, с помощью using можно открыть доступ в текущую область видимости к отдельному идентификатору пространства имен, не повлияв на остальные идентификаторы, заданные в этом пространстве. В предыдущем примере переменная value2 вызывается без явного указания пространства имен, что невозможно при обращении к valuel и values. Использование using при объявлении обеспечивает дополнительный контроль над видимостью каждого идентификатора пространства имен. В этом и заключается отличие от использования using как оператора, открывающего доступ сразу ко всем идентификаторам пространства имен.

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



Если в локальную облас1ь, где уже объявлен идентификатор из пространства имен, добавляется другой идентификатор с таким же именем, это приводит к ошибке компиляции. Ошибкой будет и объявление идентификатора из пространства имен в области, где уже существует другой идентификатор с таким же именем. Это показано в следующем примере:

namespace Window { int valuel = 20 ; int value2 = 40 ;

. . . void f() {

Int value2 = 10 :

using Window::value2 ; ряд обьявлоний std::cout value2 std::endl ;

Компиляция второй строки функции f() приведет к оишбке, поскольку переменная с именем value2 в этом блоке уже объявлена. Тот же результат получится, если объявление с using разместить перед объявлением локальной переменной valuo?.

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

namespljce Window { Int valuel - 20 ; int va]ue2 40 ;

Int value? = 10 ; . , , void f() (

using Window,.vnluo? :

,st(i:;cout value? hUI enril ;

Объявление переменной с помощью импц в функции и) скрывает глобальную переменную value?.

Как отмечалось ранее, этот способ использонпиия иь)П( позволяет дополнительно контролировать области видимости отдельных идентификаторов пространства имен. Оператор using открывает доступ п лoкaJnlHoй области ко всем идентификаторам, объявленным в пространстве имен. Поэтому предпочтительней использовать using в объявлениях, а не как оператор, чтобы п полной мере воспользоваться всеми преимуществами, предоставляемыми пространством имени. Явное расширение области видимости для отдельных идентификаторов позволяет снизить вероятность возникновения конфликтов имен. Использование оператора using оправдано только в том случае, если необходимо открыть доступ сразу ко всем идентификаторам пространства имен.



Псевдонимы пространства омен

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

namespace the software company { int value ; . . .

the software company: :va]iif; = 10 ;

namespace ISC = thesoftwnro coinpany ; ISC::value = 20 ;

Недостаток этого метода состоит в том, что подобный псевдоним может уже суше-ствовать в указанной области видимости. В этом случае компилятор сообщит об ошибке, и вы сможете просто изменить псевдоним.

Неименованные пространства имен

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

файл: one.срр namespace {

int value ;

char p( char *p ) ;

, , .

файл: two,cpp namespace {

int value ;

char p( char *p ) ;

, , ,

int main( ) {

char с = p( ptr ) ;

В каждом файле объявляется переменная value и функция р(). Благодаря тому что для каждого файла задано свое неименованное пространство, обращения к одноименным идентификаторам внутри файлов одной программы не приводит к конфликтам



1 ... 176 177 178 [ 179 ] 180 181 182 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика