Выбрать главу

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

Здесь переменная k также ограничена рамками файла One. Для новых программ рекомендуется использовать вместо модификатора static неименованное пространство имен.

Обычно для большинства коротких программ и программ среднего размера нет необходимости в создании пространств имен. Но, формируя библиотеки многократно используемых функций или классов, имеет смысл заключить свой код (если хотите обеспечить его максимальную переносимость) в собственное пространство имен.

Пространство имен std

Пространство имен std используется библиотекой C++.

Стандарт C++ определяет всю свою библиотеку в собственном пространстве имен, именуемом std. Именно по этой причине большинство программ в этой книге включает следующую инструкцию:

using namespace std;

При выполнении этой инструкции пространство имен std становится текущим, что открывает прямой доступ к именам функций и классов, определенных в этой библиотеке, т.е. при обращении к ним отпадает необходимость в использовании префикса std::.

Конечно, при желании можно явным образом квалифицировать каждое библиотечное имя префиксом std::. Например, следующая программа не привносит библиотеку в глобальное пространство имен.

// Использование явно заданной квалификации std::.

#include <iostream>

int main()

{

 double val;

 std::cout << "Введите число: ";

  std::cin >> val;

 std::cout << "Вы ввели число ";

 std::cout << val;

 return 0;

}

Здесь имена cout и cin явно дополнены именами своих пространств имен. Итак, чтобы записать данные в стандартный выходной поток, следует использовать не просто имя потока cout, а имя с префиксом std::cout, а чтобы считать данные из стандартного входного потока, нужно применить "префиксное" имя std::cin.

Если ваша программа использует стандартную библиотеку только в ограниченных пределах, то, возможно, ее и не стоит вносить в глобальное пространство имен. Но если ваша программа содержит сотни ссылок на библиотечные имена, то гораздо проще сделать пространство имен std текущим, чем полностью квалифицировать каждое имя в отдельности.

Если вы используете только несколько имен из стандартной библиотеки, то, вероятно, имеет смысл использовать инструкцию using для каждого из них в отдельности. Преимущество этого подхода состоит в том, что эти имена можно по-прежнему использовать без префикса std::, не внося при этом всю библиотеку стандартных функций в глобальное пространство имен. Рассмотрим пример.

/* Внесение в глобальное пространство имен лишь нескольких имен.

*/

#include <iostream>

// Получаем доступ к именам потоков cout и cin.

using std::cout;

using std::cin;

int main()

{

 double val;

 cout << "Введите число: ";

  cin >> val;

 cout << "Вы ввели число ";

 cout << val;

 return 0;

}

Здесь имена потоков cin и cout можно использовать напрямую, но остальная часть пространства имен std не внесена в область видимости.

Как упоминалось выше, исходная библиотека C++ была определена в глобальном пространстве имен. Если вам придется модернизировать старые С++-программы, то вы должны либо включить в них инструкцию using namespace std, либо дополнить каждое обращение к члену библиотеки префиксом std::. Это особенно важно, если вам придется заменять старые заголовочные *.h-файлы современными заголовками. Помните, что старые заголовочные *.h-файлы помещают свое содержимое в глобальное пространство имен, а современные заголовки — в пространство имен std.