3.1. Пространства имен и объявления using

До сих пор имена из стандартной библиотеки упоминались в программах явно, т.е. перед каждым из них было указано имя пространства имен std. Например, при чтении со стандартного устройства ввода применялась форма записи std::cin. Здесь использован оператор области видимости :: (см. раздел 1.2). Он означает, что имя, указанное в правом операнде оператора, следует искать в области видимости, указанной в левом операнде. Таким образом, код std::cin означает, что используемое имя cin определено в пространстве имен std.

При частом использовании библиотечных имен такая форма записи может оказаться чересчур громоздкой. К счастью, существуют и более простые способы применения членов пространств имен. Самый надежный из них — объявление using (using declaration). Другие способы, позволяющие упростить использование имен из других пространств, рассматриваются в разделе 18.2.2.

Объявление using позволяет использовать имена из другого пространства имен без указания префикса имя_пространства_имен::. Объявление using имеет следующий формат:

using пространство_имен::имя;

После того как объявление using было сделано один раз, к указанному в нем имени можно обращаться без указания пространства имен.

#include <iostream>

// объявление using; при использовании имени cin теперь

// подразумевается, что оно принадлежит пространству имен std

using std::cin;

int main() {

 int i;

 cin >> i;       // ok: теперь cin - синоним std::cin

 cout << i;      // ошибка: объявления using нет; здесь нужно указать

                 // полное имя

 std::cout << i; // ok: явно указано применение cout из

                 // пространства имен std

 return 0;

}

Для каждого имени необходимо индивидуальное объявление using

Каждое объявление using применяется только к одному элементу пространства имен. Это позволяет жестко задавать имена, используемые в каждой программе. Например, программу из раздела 1.2 можно переписать следующим образом:

#include <iostream>

// объявления using для имен из стандартной библиотеки

using std::cin;

using std::cout;

using std::endl;

int main() {

 cout << "Enter two numbers:" << endl;

 int v1, v2;

 cin >> v1 >> v2;

 cout << "The sum of " << v1 << " and " << v2

      << " is " << v1 + v2 << endl;

 return 0;

}

Объявления using для имен cin, cout и endl означают, что их можно теперь использовать без префикса std::. Напомню, что программы С++ позволяют поместить каждое объявление using в отдельную строку или объединить в одной строке несколько объявлений. Важно не забывать, что для каждого используемого имени необходимо отдельное объявление using, и каждое из них должно завершаться точкой с запятой.

Заголовки не должны содержать объявлений using

Код в заголовках (см. раздел 2.6.3) обычно не должен использовать объявления using. Дело в том, что содержимое заголовка копируется в текст программы, в которую он включен. Если в заголовке есть объявление using, то каждая включающая его программа получает то же объявление using. В результате программа, которая не намеревалась использовать определенное библиотечное имя, может случайно столкнуться с неожиданным конфликтом имен.

Примечание для читателя

Начиная с этого момента подразумевается, что во все примеры включены объявления using для имен из стандартной библиотеки. Таким образом, в тексте и примерах кода далее упоминается cin, а не std::cin.

Кроме того, для экономии места в примерах кода не будем показывать далее объявления using и необходимые директивы #include. В табл. А.1 приложения А приведены имена и соответствующие заголовки стандартной библиотеки, которые использованы в этой книге.

Читатели не должны забывать добавить соответствующие объявления #include и using в свои примеры перед их компиляцией.

Упражнения раздела 3.1

Упражнение 3.1. Перепишите упражнения из разделов 1.4.1 и 2.6.2, используя соответствующие объявления using.

Более 800 000 книг и аудиокниг! 📚

Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением

ПОЛУЧИТЬ ПОДАРОК