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




Using-директивы - часть 2


Например, предыдущий фрагмент кода может быть переписан так:

#include "pnmer.h"

// using-директива: все члены cplusplus_primer

// становятся видимыми

using namespace cplusplus_primer;

// имена matrix и inverse можно использовать без спецификации

void func( matrix &m ) {

    // ...

    inverse( m );

    return m;

}

Using-директива делает имена членов пространства имен видимыми за его пределами, в том месте, где она использована. Например, приведенная using-директива создает иллюзию того, что все члены cplusplus_primer объявлены в глобальной области видимости перед определением func(). При этом члены пространства имен не получают локальных псевдонимов, а как бы перемещаются в новую область видимости. Код

namespace A {

    int i, j;

}

выглядит как

int i, j;

для фрагмента программы, содержащего в области видимости следующую using-директиву:

using namespace A;

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

namespace blip {

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

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

}

int bj = 0;

void manip() {

    using namespace blip; // using-директива -

                          // коллизия имен ::bj and blip::bj

                          // обнаруживается только при

                          // использовании bj

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

    ++bj;                 // ошибка: неоднозначность

                          // глобальная bj или blip::bj?

    ++::bj;               // правильно: глобальная bj == 1

    ++blip::bj;           // правильно: blip::bj == 16

    int bk = 97;           // локальная bk скрывает blip::bk

    ++bk;                 // локальная bk == 98

}

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




Содержание  Назад  Вперед