[БЕЗ_ЗВУКА] Настало время наконец-то обратить внимание на ту строчку, которую мы писали в наших программах с самого начала этой специализации — с белого пояса по C++. Это строчка using namespace std. Теперь вы прекрасно понимаете, что она означает. Она означает, что мы хотим использовать все имена из пространства имен std. И давайте же посмотрим, а что же содержится в этом самом пространстве имен. В пространстве имен std находится все стандартная библиотека: все алгоритмы, все контейнеры, с которыми мы с вами работали с самого первого курса на самом деле находятся в этом пространстве имен, то есть, vector, deque, list, map — это все члены пространства имен std. Алгоритмы, примитивы работы с многопоточностью, async, future, mutex — они все находятся в пространстве имен std. Давайте посмотрим, каково это писать программы без директивы using namespace std. Уберем ее. И для примера напишем программу hello user, которая спрашивает имя пользователя и здоровается с ним. Она будет выглядеть вот так. объявляем переменную типа std::string name, спрашиваем — вернее, не так. Выводим сообщение "Enter your name" << std::endl и здороваемся с пользователем. Вот так эта программа будет выглядеть. Она у нас компилируется. Давайте мы ее запустим. Вот она работает. Или другой пример: давайте объявим с вами map, который отображает строку в вектор строк. Как это будет выглядеть? Мы напишем: std::map из std::string в std::vector<std::string>. Компилируется? Компилируется. Отлично. Эти два коротких примера демонстрируют нам два важных момента. Во-первых, все контейнеры и алгоритмы, которые мы с вами изучали имеют полные имена, которые начинаются с std::. И теперь, когда вы будете читать документацию, например на std::vector, вы будете понимать, что же это за такое std::, потому что в документации обычно для элементов стандартной библиотеки используют их полные имена std::vector, std::string и так далее. Второе важный момент заключается в том, что использование префикса std в коде, который интенсивно использует стандартную библиотеку, существенно этот код раздувает. Вот здесь мы не просто так объявили этот map — видите, у нас в одной строчке в объявлении одной переменной префикс std встречается 4 раза. И, конечно, это может существенно раздувать код и затруднять его чтение и иногда даже и написание. Поэтому давайте мы с вами сформулируем рекомендации по использованию пространства имен std. Во-первых, мы сохраняем рекомендацию о том, что не надо использовать using namespace в данном случае using namespace std в заголовочных файлах, потому что, как мы посмотрели в предыдущем видео, это может приводить к конфликтам имен. У нас на наших курсах этих конфликтов не возникает из-за используемого стиля именования функции и классов. Так как в пространстве имен std все функции и классы начинаются с маленькой буквы, а мы функции и классы называем с большой буквы. Но в общем случае в больших проектах в других проектах за пределами нашей специализации может использоваться стиль, когда функции и классы именуются с маленькой буквы, и тогда они могут конфликтовать с тем, что есть в пространстве имен std. Поэтому не стоит использовать using namespace std в заголовочных файлах. В cpp-файлах ситуация другая. Как мы с вами видели, часто мы в cpp-файлах можем интенсивно использовать стандартную библиотеку. И поэтому в них все-таки практичным является использование директивы using namespace std даже в глобальном пространстве имен. Либо в отдельных функциях использование using-декларации или using namespace std — в принципе, хорошая практичная рекомендация, но только для cpp-файлов. И давайте мы с вами переключимся в Eclipse, перейдем к проекту, который мы рассматривали в предыдущем видео — нашу программу по работе с личными финансами. И давайте мы перепишем ее в соответствии с рекомендациями, которые мы только что озвучили. Во-первых, у нас с предыдущего видео остался вот этот вот using namespace Json, который нельзя использовать — давайте мы его вернем назад, чтобы наша программа компилировалась. Отлично. Так, проверим компиляцию. Все хорошо. Так вот. А теперь давайте перейдем к json.h и поправим его, потому что мы в нем используем using namespace std, а мы только что договорились, что не будем использовать эту директиву в заголовочных файлах. Удаляем ее. И теперь в этом заголовочном файле нам нужно расставить префикс std везде, где мы используем элементы стандартной библиотеки. Это vector, map, string, здесь, теперь здесь. Так. Конечно, код наш именно в заголовочном файле от этого немного раздувается. Но зато мы страхуем себя от неприятных проблем. При этом в cpp-файле мы не будем расставлять префикс std, а спокойно напишем using namespace std, потому что cpp-файл никуда не будет включаться и мы можем более безопасно использовать здесь директиву using namespace. Запустим компиляцию, и у нас все хорошо. Осталось сделать то же самое для xml .h. Так же удаляем и [ШУМ] применяем префикс std везде, где это необходимо. Все. Хорошо. Так, здесь у нас их нету и здесь в Document — istream. Переходим в cpp-файл, и здесь у нас уже есть using namespace std, и наша программа должна компилировать, но не компилируется, потому что мы еще в одном месте забыли префикс std и в ее реализации тоже. Запускаем компиляцию. И все хорошо — наша программа компилируется и таким образом мы применили те самые рекомендации, которые только что сформулировали. Давайте подведем итоги. В этом видео мы узнали, что вся стандартная библиотека находится в пространстве имен std и обсудили рекомендации по использованию этого пространства имен. Мы сказали, что директива using namespace std существенно сокращает код, который интенсивно используют стандартную библиотеку, но ее нельзя применять в заголовочных файлах и с осторожностью надо применять в cpp-файлах.