Эта конструкция называется объявлением using
Иногда мы предпочитаем ссылаться на пространство имен еще “короче”: “Если вы не видите объявления имени в области видимости, ищите в пространстве имен std”. Для того чтобы сделать это, используется директива using
using namespace std; // открывает доступ к именам из пространства std
Эта конструкция стала общепринятой.
#include
#include
using namespace std; // открывает доступ к именам из пространства std
int main
{
string name;
cout << "Пожалуйста, введите имя \n";
cin >> name;
cout << "Привет, " << name << '\n';
}
Здесь поток cin
std::cin
, класс string
это класс std::string
и т.д. Поскольку мы используем заголовочный файл std_lib_facilities.h
, не стоит беспокоиться о стандартных заголовках и пространстве имен std
. Мы рекомендуем избегать использования директивы using для любых пространств имен, за исключением тех из них, которые широко известны в конкретной области приложения, например пространства имен std
. Проблема, связанная с чрезмерным использованием директивы using
, заключается в том, что мы теряем след имен и рискуем создать коллизию. Явная квалификация с помощью соответствующих имен пространств имен и объявлений using
не решает эту проблему. Итак, размещение директивы using
в заголовочный файл (куда пользователю нет доступа) — плохая привычка. Однако, для того чтобы упростить первоначальный код, мы разместили директиву using для пространства имен std
в заголовочном файле std_lib_facilities.h
. Это позволило нам написать следующий код:#include "std_lib_facilities.h"
int main
{
string name;
cout << "Пожалуйста, введите имя \n";
cin >> name;
cout << "Привет, " << name << '\n';
}
Мы обещаем больше никогда так не делать, если речь не идет о пространстве имен std
Задание
• Создайте три файла: my.h
my.cpp
и use.cpp
. Заголовочный файл my.h
содержит следующий код:extern int foo;
void print_foo;
void print(int);
Исходный файл my.cpp
#include
для вставки файлов my.h
и std_lib_facilities.h
, определение функции print_foo
для вывода значения переменной foo
в поток cout
и определение функции print(int i)
для вывода в поток cout
значения переменной i
.Исходный файл use.cpp
#include
для вставки файла my.h
, определение функции main
для присвоения переменной foo
значения 7
и вывода ее на печать с помощью функции print_foo
, а также для вывода значения 99
с помощью функции print
. Обратите внимание на то, что файл use.cpp
не содержит директивы #include std_lib_facilities.h
, поскольку он не использует явно ни одну из его сущностей.Скомпилируйте эти файлы и запустите их. Для того чтобы увидеть результаты вывода на печать в системе Windows, в проект следует включить функции use.cpp
my.cpp
и использовать в файле use.cpp
код { char cc; cin>>cc; }
.2. Напишите три функции: swap_v(int,int)
swap_r(int&,int&)
и swap_cr(const int&,const int&)
. Каждая из них должна иметь тело{ int temp; temp = a, a=b; b=temp; }
где a
b
— имена аргументов.Попробуйте вызвать каждую из этих функций, как показано ниже.
int x = 7;
int y =9;
swap_?(x,y); // замените знак ? буквами v, r или cr
swap_?(7,9);
const int cx = 7;
const int cy = 9;
swap_?(cx,cy);
swap_?(7.7,9.9);
double dx = 7.7;
double dy = 9.9;
swap_?(dx,dy);
swap_?(dx,dy);
Какие функции и вызовы будут скомпилированы и почему? После каждой скомпилированной перестановки выведите на экран значения аргументов, чтобы убедиться, что они действительно поменялись местами. Если результат вас удивит, обратитесь к разделу 8.6.
3. Напишите программу, использующую единственный файл, содержащий пространства имен X
Y
и Z
, так, чтобы функция main
, приведенная ниже, работала правильно.int main
{
X::var = 7;