Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
36
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

94 Глава 2

Объявление переменной value находится вне определения main (). Об этом объявлении также говорят, как об области видимости глобального пространства имен, потому что объявление переменной находится вне какого-либо пространства имен. Переменная доступна в любом месте main (), равно как и из определения любой дру- гой функции, которая может встретиться в том же исходном файле. Я поместил объ- явление value вне main (), просто чтобы продемонстрировать в следующем разделе, как его можно поместить в пространство имен.

Обратите внимание на отсутствие объявления using для cout и endl. В данном случае оно не нужно, поскольку имена из пространства имен std квалифицированы полностью. Может быть, поступать так и неразумно, но вы можете использовать cout в качестве имени своей переменной, и это не приведет ни к какой путанице, потому что cout будет отличаться от std: :cout. Таким образом, пространства имен предо- ставляют возможность отделить имена, используемые в одной части программы, от имен, применяемых в другой. Это чрезвычайно ценно, когда речь идет о крупном проекте, в работе над которым задействовано несколько групп программистов, зани- мающихся разными частями программы. Каждая команда может иметь собственное пространство имен, и в этом случае можно не беспокоиться о том, что они непредна- меренно используют одно и то же имя для различных функций.

Взгляните на следующую строку кода:

Этот оператор называется директивой using.

Эффект от его применения состоит в том, что все имена из пространства std импортируются в ваш исходный файл, так что вы можете из своей программы ссы- латься на все, что определено в этом пространстве имен, без квалифицированного имени. То есть, вы можете писать имя cout вместо std: :cout и end! вместо std: : endl. Недостатком такого применения директивы using является то, что сводится на нет основная причина применения пространств имен — то есть, предотвращение непреднамеренных конфликтов. Самый безопасный способ доступа к именам из про- странства имен — это квалифицировать каждое имя явно вместе с наименованием пространства имен; к сожалению, это делает код очень многословным и снижает его читабельность. Другая возможность — представить объявлением using только те име- на, которые вы используете в своем коде, например:

Эти операторы называются объявлениями using. Каждый оператор представляет одно имя из указанного пространства и позволяет применять его без квалификации внутри последующего программного кода. Это обеспечивает более удобный способ импортирования из пространства имен, поскольку импортируются лишь те имена, ко- торые действительно нужны в программе. Поскольку Microsoft установила прецедент импорта всего пространства имен System для кода C++/CLI, я буду придерживаться этого в примерах C++/CLI. Но вообще я рекомендую использовать в своем коде объ- явления using вместо директив using, когда вы пишете программы сколько-нибудь значительного размера.

Конечно, вы можете определить свое собственное пространство имен по своему выбору. В следующем разделе показано, как это сделать.

Данные, переменные и вычисления 95

Объявление пространства имен

Для объявления пространства имен применяется ключевое слово namespace:

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

Вы не можете объявить пространство имен внутри функции. Оно предназначе- но для другого применения: вы используете в вашей программе пространства имен как контейнер для функций, глобальных переменных и других именованных сущно- стей наподобие классов. Функция main (), где начинается выполнение программы, всегда должна быть в глобальном пространстве имен, иначе компилятор не распозна- ет ее.

Вы можете поместить переменную value из предыдущего примера в пространство имен:

Пространство имен myStuf f определяет область видимости, и все, что находится внутри него, квалифицировано именем этого пространства имен. Чтобы сослаться извне на имя, объявленное внутри пространства имен, вы должны квалифицировать его именем пространства имен. Внутри же области видимости пространства имен на любое имя, объявленное в нем, можно ссылаться без квалификации — здесь все иден- тификаторы принадлежат одному семейству. Но в функции main () вы теперь должны квалифицировать имя value префиксом myStuf f, иначе программа не скомпилиру- ется. Функция main () теперь ссылается на имена из двух разных пространств, и в общем случае вы можете иметь столько пространств имен в вашей программе, сколь- ко вам нужно. Вы можете исключить необходимость квалификации имени value, до- бавив директиву using: