С++ для начинающих

       

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


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

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

namespace cplusplus_primer {

    namespace MatrixLib {

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

    // ...

    }

}

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

using cplusplus_primer::MatrixLib::matrix;

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

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

void func( matrix &m );

Оно вводит функцию func() с параметром типа cplusplus_primer:: MatrixLib::matrix.

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

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

    namespace blip {

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

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

    }

    int bj = 0;

    void manip() {

        using blip::bi; // bi в функции manip() ссылается на blip::bi

        ++bi;           // blip::bi == 17

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

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

        ++bj;           // blip::bj == 16

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

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

    }

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

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

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

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

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



    Содержание раздела