Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

Эта конструкция называется объявлением using. Она эквивалентна обращению “Грэг”, которое относится к Грэгу Хансену при условии, что никаких других Грэгов в комнате нет.

Иногда мы предпочитаем ссылаться на пространство имен еще “короче”: “Если вы не видите объявления имени в области видимости, ищите в пространстве имен std”. Для того чтобы сделать это, используется директива using.


using namespace std; // открывает доступ к именам из пространства std


Эта конструкция стала общепринятой.


#include     // доступ к библиотеке string

#include   // доступ к библиотеке 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);

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;

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже