Программирование. Принципы и практика использования C++ Исправленное издание, стр. 120
{ return Date(1970,1,1);}Эта функция создает объект типа
Datedefault_date()default_date()const Date& default_date(){ static const Date dd(1970,1,1); // инициализируем dd // только при первом вызове return dd;}Статическая локальная переменная инициализируется (создается) только при первом вызове функции, в которой она объявлена. Обратите внимание на то, что мы вернули ссылку, чтобы исключить ненужное копирование, и, в частности, вернули константную ссылку, чтобы предотвратить несанкционированное изменение значения аргумента при вызове функции. Рассуждения о передаче аргумента (см. раздел 8.5.6) относятся и к возвращаемому значению.
8.7. Пространства имен
Для организации кода в рамках функции используются блоки (см. раздел 8.4).
Для организации функций, данных и типов в рамках типа используется класс (глава 9). Предназначение функций и классов заключается в следующем.
• Они позволяют определить множество сущностей без опасения, что их имена совпадут с другими именами в программе.
• Позволяют именовать то, что мы определили.
Нам нужно иметь средство для организации классов, функций, данных и типов в виде идентифицируемой и именованной части программы, не прибегая к определению типа. Языковый механизм, позволяющий осуществить такую группировку объявлений, называют пространством имен (namespace). Например, мы можем создать графическую библиотеку с классами
ColorShapeLineFunctionTextnamespace Graph_lib { struct Color { /* ... */ }; struct Shape { /* ... */ }; struct Line: Shape { /* ... */ }; struct Function: Shape { /* ... */ }; struct Text: Shape { /* ... */ }; // ... int gui_main() { /* ... */ }}Очень вероятно, что вы также захотите использовать эти имена, но теперь это уже не имеет значения. Вы можете определить сущность с именем
TextGraph_lib::TextTextGraph_libTextGraph_libGraphicsДопустим, ваш класс
TextGraph_libTextLibnamespace TextLib { class Text { /* ... */ }; class Glyph { /* ... */ }; class Line { /* ... */ }; // ...}Если бы мы использовали оба пространства имен одновременно, то столкнулись бы с реальной проблемой. В этом случае действительно возникла бы коллизия между именами классов
TextLineTextGraph_lib::TextTextLib::Text::8.7.1. Объявления using и директивы using
Писать полностью определенные имена довольно утомительно. Например, средства стандартной библиотеки языка С++ определены в пространстве имен
std#include<string> // доступ к библиотеке string#include<iostream> // доступ к библиотеке iostreamint main(){ std::string name; std::cout << " Пожалуйста, введите имя \n"; std::cin >> name; std::cout << " Привет, " << name << '\n';}Тысячи раз обращаясь к элементам стандартной библиотеки
stringcoutstd::stringstd::coutstringstd::stringcoutstd::cout