|
Программирование >> Расширенная версия языка c++
384 Самоучитель C-h-h либо объектом целевого типа, либо объектом от целевого типа. (Вставьте нужное слово.) . 6. Можно ли с помощью оператора dynainic cast снять атрибут const? . .if 13.1. Пространства имен О пространствах имен коротко было рассказано в главе 1, сейчас мы рассмотрим это понятие более подробно. Пространства имен появились в C++ относительно недавно. Они предназначены для локализации имен идентификаторов во избежание конфликтов имен (name collisions). В среде программирования C++ сосуществует невероятное количество имен переменных, функций и классов. До введения понятия пространств имен все эти имена находились в одном глобальном пространстве имен и возникало множество конфликтов. Например, если вы в своей программе определяли функцию toupperO, то она могла бы (в зависимости от списка своих параметров) подменить стандартную библиотечную функцию tonpper(), поскольку имена обеих функций хранились бы в одном глобальном пространстве имен. Конфликты имен имеют место, когда в одной и той же программе используются библиотеки функций и классов разных производителей. В этом случае вполне возможно - и даже очень вероятно, - что имена, определенные в одной библиотеке, будут конфликтовать с теми же именами, но определенными в другой библиотеке. Все проблемы решило введение понятия пространств имен и ключевого слова namespace. Это ключевое слово позволяет локализовать область видимости имен, объявленных в данном пространстве имен. Пространство имен дает возможность использовать одно и то же имя в разных контекстах и при этом почвы для конфликтов не возникает. Вероятно, больше всего выиграла от введения пространств имен стандартная библиотека C++ (C++ standard library). В ранних версиях языка вся библиотека C++ определялась в глобальном пространстве имен. Теперь библиотека C++ определяется в собственном пространстве имен std, что значительно снижает вероятность конфликтов имен. Вы также можете создавать в программе свои собственные пространства имен, чтобы локализовать область видимости тех имен, которые, по вашему мнению, могли бы вызывать конфликты. Это особенно важно при создании собственных библиотек классов или функций. Ключевое слово namespace путем объявления именованных областей дает возможность разделить глобальное пространство имен. По существу, пространство имен определяет область видимости. Ниже приведена основная форма использования ключевого слова namespace: namespace имя { объявления -it ,1 .1,-!. class myclass { public: voi (int x) { i = x; } int geti () { return i; } Здесь имена переменных i и k, функции c(), а также класса myclass находятся в области видимости, определенной пространством имен My- NameSpace. К идентификаторам, объявленным в пространстве имен, внутри этого пространства можно обращаться напрямую. Например, в пространстве имен MyNameSpace в инструкции гп i переменная i указана явно. Однако поскольку ключевое слово namespace определяет некоторую область видимости, то при обращении извне пространства имен к объектам, объявленным внутри этого пространства, следует указывать оператор расширения области видимости. Например, чтобы присвоить значение 10 переменной i в той части программы, которая не входит в пространство имен MyNameSpace, необходимо использовать следующую инструкцию: MyNameSpace::i = 10; , . . А чтобы объявить объект тип lass в той части программы, которая не входит в пространство имен MyNameSpace, нужна такая инструкция: MyNameSpace::myclass ob; Таким образом, для доступа к члену пространства имен извне этого пространства перед именем члена следует указать имя пространства имен с оператором расширения области видимости. Можно себ азить, что если в вашей программе обращения к членам пространства имен происходят достаточно часто, необходимость каждый раз указывать имя пространства имен и оператор расширения области видимости может быстро надоесть. Для решения этой проблемы была разработана инструкция using. У этой инструкции имеются две основные формы: using namespace имя; . . .Г .;)<, fr using имя; гулвя; - --.л-л - . Все, что определено внутри инструкции namespace, находится внутри области видимости данного пространства имен. Ниже приведен пример объявления пространства имен MyNameSpace: namespace еЗрасе { . ( void myfunc (int j) { cout j; } В первой форме параметр имя задает имя пространства имен, доступ к которому вы хотите получить. При использовании этой формы инструкции using все члены, определенные в указанном пространстве имен, становятся доступными в текущем пространстве имен и с ними можно работать напрямую, без необходимости каждый раз указывать имя пространства и оператор расширения области видимости. При использовании второй формы инструкции using видимым делается только указанный в инструкции член пространства имен. Например, пусть у нас имеется описанное выше пространство имен MyNameSpace, тогда правильны все представленные ниже инструкции using и операторы присваивания: usin расе: : к; видимой делается только переменная k k = 10; инструкция правильна, поскольку переменная k видима using namespace MyNameSpace; даиллли делаются все члены пространства имен MyNameSpace i = 10; инструкции ильна, поскольку видимы все члены пространства имен MyNameSpace Имеется возможность объявить более одного пространства имен с одним и тем же именем. Это позволяет разделить пространство имен на несколько файлов или даже разделить пространство имен внутри одного файла. Рассмотрим следующий пример: namespace NS { . , . , , int i; , ; - . ... - - namespace NS { Л-. - Ч int j ; Здесь пространство имен NS разделено на две части. Несмотря на это, содержимое каждой части по-прежнему остается в одном и том же пространстве имен - пространстве NS. Пространство имен должно объявляться вне всех остальных областей видимости за исключением того, что одно пространство имен может быть вложено в другое. То есть вложенным пространство имен может быть только в другое пространство имен, но не в какую бы то ни было иную область видимости. Это означает, что нельзя объявлять пространства имен, например, внутри функции. Имеется пространство имен особого типа - безымянное пространство имен (unnamed namespace). Безымянное пространство имен позволяет создавать идентификаторы, являющиеся уникальными внутри некоторого файла. Ниже представлена основная форма безымянного пространства имен:
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |