Программирование >>  Инициализация объектов класса, структура 

1 ... 135 136 137 [ 138 ] 139 140 141 ... 395


#include primer.h

трудно читать! void func( cplusp

cplusplus primer::MatrixLib::matrix &m )

...

cplusplLis primer::MatrixLib::inverse( m ); return m;

длинное определение функции func() выше:

Разрешается задать псевдоним для обозначения вложенного cplusplLis primer::MatrixLib, сделав определение функции более удобным для

#include primer.h

более короткий псевдоним

namespace mlib = cplusplus primer::MatrixLib;

читать проще!

void func( mlib::matrix &m )

return m;

mlib::inverse( m );

восприятия:

Одно пространство имен может иметь несколько взаимозаменяемых псевдонимов. Например, если псевдоним Lib ссылается на cplusplus primer, то определение

псевдоним alias относится к пространству имен cplusplus primer namespace alias = Lib;

void func( cplusplus primer::matrix &m ) { / /

...

alias::inverse( m ); return m;

функции funco может выглядеть и так:

namespace IBM = International Business Machines;

Объявление псевдонима начинается ключевым словом namespace, за которым следует короткий псевдоним, а за ним - знак равенства и исходное полное имя пространства. Если полное имя не соответствует никакому известному пространству, это ошибка.

Псевдоним может относиться и к вложенному пространству имен. Вспомним слишком



namespace cplusplus primer { namespace MatrixLib {

class matrix { /* ... */ }; ...

using-объявление для члена matrix

квалифицированное имя члена пространства. Например:

using cplusplus primer::MatrixLib::matrix;

Using-объявление вводит имя в ту область видимости, в которой оно использовано. Так, пред1дущее using-объявление делает имя miatrix глобально видим1м.

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

void func( matrix &m );

Оно вводит функцию func() с параметром типа cplusplus primer::

MatrixLib::matrix.

Using-объявление ведет себя подобно любому другому объявлению: оно имеет область видимости, и имя, введенное им, можно употреблять начиная с места объявления и до конца области видимости. Using-объявление может использоваться в глобальной области видимости, равно как и в области видимости любого пространства имен. Оно употребляется и в локальной области. Имя, вводимое using-объявлением, как и любым другим, имеет следующие характеристики:

оно должно быть уникальн1м в своей области видимости;

оно скрывает одноименную сущность во внешней области;

оно скрывается объявлением одноименной сущности во вложенной области. Например:

8.6.2. Using-объявления

Имеется механизм, позволяющий обращаться к членам пространства имен, используя их имена без квалификатора, т.е. без префикса namespace name::. Для этого применяются using-объявления.

Using-объявление начинается ключевым словом using, за которым следует



namespace blip {

int bi = 16, bj = 15, bk = 23;

прочие объявления

int bj = 0;

void manip() {

using blip::bi; bi в функции manip() сс1лается на blip::bi ++bi; blip::bi == 17

using blip::bj; скрывает глобально bj

bj в функции manip() сс1лается на blip::bj

++bj; blip::bj == 16

int bk; объявление локальной bk

using blip::bk; ошибка: повторное определение bk в manip()

int wrongInit = bk; ошибка: bk невидима

надо использовать blip::bk

Using-объявления в функции mianip() позволяют ссылаться на членов пространства blib с помощью неквалифицированных имен. Такие объявления не видны вне manip() , и неквалифицированные имена могут применяться только внутри этой функции. Вне ее необходимо употреблять квалифицированные имена.

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

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

8.6.3. Using-директивы

Пространства имен появились в стандартном С++. Предыдущие версии С++ их не поддерживали, и, следовательно, поставляемые библиотеки не помещали глобальные объявления в пространства имен. Множество программ на С++ было написано еще до того, как компиляторы стали поддерживать такую опцию. Заключая содержимое библиотеки в пространство имен, мы можем испортить старое приложение, использующее ее предыдущие версии: все имена из этой библиотеки становятся квалифицированными, т.е. должны включать имя пространства вместе с оператором разрешения области видимости. Те приложения, в которых эти имена употребляются в неквалифицированной форме, перестают компилироваться.

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



1 ... 135 136 137 [ 138 ] 139 140 141 ... 395

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