Kniga-Online.club
» » » » Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Читать бесплатно Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп. Жанр: Программирование год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:
};

  struct Function: Shape { /* ... */ };

  struct Text: Shape { /* ... */ };

  // ...

  int gui_main() { /* ... */ }

}

Очень вероятно, что вы также захотите использовать эти имена, но теперь это уже не имеет значения. Вы можете определить сущность с именем Text, но ее уже невозможно перепутать с нашим классом, имеющим то же имя. Наш класс называется Graph_lib::Text, а ваш класс — просто Text. Проблема возникнет только в том случае, если в вашей программе есть класс или пространство имен Graph_lib, в которое входит класс Text. Имя Graph_lib довольно неудачное; мы выбрали его потому, что “прекрасное и очевидное” имя Graphics имеет больше шансов встретиться где-нибудь еще.

Допустим, ваш класс Text является частью библиотеки для обработки текстов. Та же логика, которая заставила нас разместить графические средства в пространстве имен Graph_lib, подсказывает, что средства для обработки текстов следует поместить в пространстве имен, скажем, с именем TextLib.

namespace TextLib {

  class Text { /* ... */ };

  class Glyph { /* ... */ };

  class Line { /* ... */ };

  // ...

}

Если бы мы использовали оба пространства имен одновременно, то столкнулись бы с реальной проблемой. В этом случае действительно возникла бы коллизия между именами классов Text и Line. И что еще хуже, если бы мы были не создателями, а пользователями библиотеки, то не никак не смогли бы изменить эти имена и решить проблему. Использование пространств имен позволяет избежать проблем; иначе говоря, наш класс Text — это класс Graph_lib::Text, а ваш — TextLib::Text. Имя, составленное из имени пространства имен (или имени класса) и имени члена с помощью двух двоеточий, ::, называют полностью определенным именем (fully qualified name).

8.7.1. Объявления using и директивы using

Писать полностью определенные имена довольно утомительно. Например, средства стандартной библиотеки языка С++ определены в пространстве имен std и могут использоваться примерно так:

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

#include<iostream> // доступ к библиотеке iostream

int main()

{

  std::string name;

  std::cout << " Пожалуйста, введите имя n";

  std::cin >> name;

  std::cout << " Привет, " << name << 'n';

}

Тысячи раз обращаясь к элементам стандартной библиотеки string и cout, мы на самом деле вовсе не хотим каждый раз указывать их полностью определенные имена — std::string и std::cout. Напрашивается решение: один раз и навсегда указать, что под классом string мы имеем в виду класс std::string, а под потоком cout — поток std::cout и т.д.

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&). Каждая из

Перейти на страницу:

Бьёрн Страуструп читать все книги автора по порядку

Бьёрн Страуструп - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


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

Отзывы читателей о книге Программирование. Принципы и практика использования C++ Исправленное издание, автор: Бьёрн Страуструп. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*