- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Шрифт:
Интервал:
Закладка:
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&). Каждая из

