using std::string; // string означает std::string
using std::cout; // cout означает std::cout
// ...
Эта конструкция называется объявлением
using
. Она эквивалентна обращению “Грэг”, которое относится к Грэгу Хансену при условии, что никаких других Грэгов в комнате нет.
Иногда мы предпочитаем ссылаться на пространство имен еще “короче”: “Если вы не видите объявления имени в области видимости, ищите в пространстве имен std”. Для того чтобы сделать это, используется директива
using
.
using namespace std; // открывает доступ к именам из пространства std
Эта конструкция стала общепринятой.
#include<string> // доступ к библиотеке string
#include<iostream> // доступ к библиотеке iostream
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);