====== пространства имён и using ====== ===== namespace ===== Пространство имен позволяет сгруппировать функционал в отдельные контейнеры. Пространство имен представляет блок кода, который содержит набор компонентов (функций, классов и т.д.) и имеет некоторое имя, которое прикрепляется к каждому компоненту из этого пространства имен. Полное имя каждого компонента — это имя пространства имен, за которым следует оператор :: (оператор области видимости или scope operator) и имя компонента. Примером может служить оператор cout, который предназначен для вывода строки на консоль и который определен в пространстве имен std. Соответственно чтобы обратиться к этому оператору, применяется выражение std::cout. Глобальное пространство имен - пространство имен по-умолчанию, используемое если не указанно иное пространство имен. ++++пример| #include void print(const std::string&); const std::string message{"hello"}; int main() { print(message); } void print(const std::string& text) { std::cout << text << std::endl; } Здесь определены функции print и main и константа message и не используется никакого пространства имен. Поэтому фактически функции print и main и константа message определены в глобальном пространстве имен. В принципе для обращения к ним также можно использовать оператор ::, только без названия пространства имен, хотя это и избыточно: int main() { ::print(::message); } ++++ ==== Определение пространства имен ==== #include namespace hello { const std::string message{"hello work"}; void print(const std::string& text) { std::cout << text << std::endl; } } // namespace hello int main() { hello::print(hello::message); // hello work } ==== Вложенные пространства имен ==== Одно пространство имен может содержать в себе другое #include namespace console { namespace messages { const std::string hello{"hello"}; const std::string welcome{"Welcome"}; const std::string goodbye{"Good bye"}; } // namespace messages void print(const std::string& text) { std::cout << text << std::endl; } void print_default() { std::cout << messages::hello << std::endl; } } // namespace console int main() { console::print(console::messages::hello); } для обращения к члену вложенного пространства имен нужно использовать цепочку обращений. ===== using ===== используеться для задания псевдонимов((пседонимов, а не новых типов данных!)) Например: #include using ullong = unsigned long long; int main() { ullong n {10234}; std::cout << n << std::endl; } стоит отметить что для задания псевдонимов можно исопльзовать и старых подход из Си через typedef: #include typedef unsigned long long ullong; int main() { ullong n {10234}; std::cout << n << std::endl; } так же using можно использовать для задания членов пространств имен, которые мы сможем использовать не указывая пренадлежность к пространству имен ''using пространство_имен::объект'' #include using std::cin; using std::cout; using std::endl; int main() { int age; cout << "Input age: "; cin >> age; cout << "Your age: " << age << endl; } или и вовсе охватить все члены пространства имен так: ''using namespace пространство_имен''