Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.71
CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
#1

using namespace std - C++

08.08.2013, 12:53. Просмотров 6132. Ответов 11
Метки нет (Все метки)

Обьясните пожалуйста понятным языком, что такое пространство имен, и зачем нужна эта команда или std::
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2013, 12:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос using namespace std (C++):

Использовать using namespace std; или каждый раз прописывать std:: . ?
Как безопаснее и рациональнее поступать? Как в больших проектах поступают на этот счет?

Что использовать, std::cout или просто using namespace std?
Приветствую! Сейчас учу С++, постигаю азы так сказать. В арсенале две книги - Джефф Кент, "Основы программирования " и Х.М....

Зачем часто писать std::, если можно один раз using namespace std?
зачем часто писать std:: если можно один раз using namespace std?

Пространство имен - namespace std или std::
В каких случая лучше писать (std::cout) или просто прописать (namespace std) и почему ?

Std:: или using namespace std;
Вопрос к профессионалам. Меня давно интересуют такие вопросы: 1) Почему, многим, вроде бы не безграмотным С++-шникам, в консольных...

Using namespace std
В чем отличие, если один cout (или что-то другое) будет в std, а другой stdd, для чего вообще using namespace? Уже везде где только можно...

11
alex1392
31 / 31 / 4
Регистрация: 24.07.2013
Сообщений: 187
08.08.2013, 13:04 #2
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
Обьясните пожалуйста понятным языком, что такое пространство имен, и зачем нужна эта команда или std::
Есть большое множивство разнообразного функционала и оно скрыто в std
Проше будит обьяснить так если ты создаш 2-ве функции с одинаковыми именами ты не сможиш их применять однако если ты разместиш их прототипы в разных хедерах и подключиш только 1-н то все будит нормально ) тоесть std это стандартная пространство имен но если ты попробуеш создать чтото такое что уже там присутствует или имеет эдентичное название ты получиш ошибку . а когда ты пишиш using namespace std ты достаеш все что там храниться и можиш использовать в своей проге

Добавлено через 5 минут
Однако такжи можно не использовать все пространство имен а доставать только то что тебе необходимо например
std::cout
std::cin

в таком случае ты сможиш использовать все что тебе необходимо из std и такжи использовать свои классы функции имеющие эдентичные названия с теми что хранятся в std
1
CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
08.08.2013, 13:13  [ТС] #3
Цитата Сообщение от alex1392 Посмотреть сообщение
Есть большое множивство разнообразного функционала и оно скрыто в std
Проше будит обьяснить так если ты создаш 2-ве функции с одинаковыми именами ты не сможиш их применять однако если ты разместиш их прототипы в разных хедерах и подключиш только 1-н то все будит нормально ) тоесть std это стандартная пространство имен но если ты попробуеш создать чтото такое что уже там присутствует или имеет эдентичное название ты получиш ошибку . а когда ты пишиш using namespace std ты достаеш все что там храниться и можиш использовать в своей проге

Добавлено через 5 минут
Однако такжи можно не использовать все пространство имен а доставать только то что тебе необходимо например
std::cout
std::cin

в таком случае ты сможиш использовать все что тебе необходимо из std и такжи использовать свои классы функции имеющие эдентичные названия с теми что хранятся в std
А почему я например могу два раза ввести printf и не вводить std?
0
alex1392
31 / 31 / 4
Регистрация: 24.07.2013
Сообщений: 187
08.08.2013, 13:28 #4
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
А почему я например могу два раза ввести printf и не вводить std?
точно не скажу но printf это функция Си возможно что она заложина в глубине самого языка и не относиться к std )
ух щяз меня бить будут ))

Добавлено через 6 минут
Но уверености 0 ибо с принтф ваапше не общяюсь)
0
Belfegor
08.08.2013, 13:29
  #5

Не по теме:

Цитата Сообщение от alex1392 Посмотреть сообщение
printf
Цитата Сообщение от alex1392 Посмотреть сообщение
она заложина в глубине самого языка
Цитата Сообщение от alex1392 Посмотреть сообщение
меня бить будут
будут

0
coloc
погромист
411 / 247 / 30
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
08.08.2013, 13:30 #6
CHELOVEKPAUK, Неймспейсы ввели в язык С++ для того, чтобы избежать коллизии имен

Не по теме:

alex1392, пожалуйста, пишите грамотно, в редакторе сообщений есть же подчеркивание неправильных слов. Читать невозможно ИМХО

0
Кудаив
409 / 408 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
08.08.2013, 13:31 #7
Цитата Сообщение от alex1392 Посмотреть сообщение
printf это функция Си возможно что она заложина в глубине самого языка и не относиться к std
вообще верно, сишные функции относятся к глобальному пространству имен, но если добавлять хидеры например #include <cstdio>, то все функции этого файла помещаются в std

пример - пишешь ты игру - и есть у тебя в игре собачка, кошечка и человек, и вот пишешь ты графику и обзываешь классы HymanGraphic, CatGraphic и DogGraphic. Для звуков извлекаемых из твоих персонажей - HumanSound, CatSound, DogSound - в таком духе то есть для каждого модуля придумывать уникальное имя чтоб конфликтов не было. С пространствами имен ты определяешь пространства Graphic{Human, Dog, Cat} и Sound{Human, Dog, Cat} и сразу видно что к чему относится - ну няша же
1
Croessmah
++Ͻ
14146 / 8071 / 1512
Регистрация: 27.09.2012
Сообщений: 19,905
Записей в блоге: 3
Завершенные тесты: 1
08.08.2013, 13:48 #8
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
Обьясните пожалуйста понятным языком, что такое пространство имен,
Представьте себе Вашу файловую систему без каталогов - всё в корневике (в глобальном пространстве имен).
Какие проблемы могут возникнуть?
Самое первое - нельзя иметь два файла с одним именем на самом деле можно, но сейчас не об этом потому как возникнет конфликт имен.
Теперь допустим, что всё же у нас два разных файла с одним именем (файл1) оказались в корневике и Вам начальник со свирепым выражением лица, крича и разбрызгивая во все стороны свою слюну кричит "Открой файл1", но вот беда - их два и какой открывать? У Вас по сути один нормальный путь - спросить какой именно, собственно компилятор так и делает - выдает ошибку с текстом на подобии "Имя 'такое-то' двусмысленно".
А если бы всё лежало по папкам, то коллизий бы не возникло.
Вам бы сказали открыть файл "файл1" из каталога "каталог1" ( каталог1::файл1 )
или открыть файл "файл1" из каталога "каталог2" ( каталог2::файл1 )

А теперь к примеру на программе:
А теперь представьте, что написали Вы программу, всё работает - класс, всё довольны!
И вот решили вдруг, что нужно еще сделать пару фишек. Нашли стороннюю библиотеку, которая отлично подходит для реализации этих самых "фишек", но вот беда в ней есть классы с таким же именем как и у Вас. Что делать? Создавать копию Вашего класса, но с другим именем? Ну это жестко.
Вот пространства имен призваны решать такие проблемы. Например, вся стандартная библиотека, содержится в одном пространстве имен std, а подключаемые файлы так же определяют свои пространства имен, например библиотека boost находится в пространстве имен boost. Если писать boost::vector, то будет понятно, что используется вектор из библиотеки boost, а не std.
Что касается using namespace такое-то, это означает примерно следующее:
"Использовать пространство имен такое-то в этой области видимости".
То есть мы "скидываем" всё содержимое пространства имен в "текущую" область видимости, тем самым её засоряя ( пример про корневой каталог без разделения на папки ).

То есть пространства имен можно рассматривать как уточнение имени сущности.
23
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
08.08.2013, 14:18 #9
Цитата Сообщение от Croessmah Посмотреть сообщение
То есть пространства имен можно рассматривать как уточнение имени сущности.
Почему зачернул? Всё же верно.
0
Croessmah
++Ͻ
14146 / 8071 / 1512
Регистрация: 27.09.2012
Сообщений: 19,905
Записей в блоге: 3
Завершенные тесты: 1
08.08.2013, 14:20 #10
Цитата Сообщение от Tulosba Посмотреть сообщение
Почему зачернул? Всё же верно.
Безымянные пространства что-то смущают (даже как замена static)
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
08.08.2013, 14:41 #11
Цитата Сообщение от Croessmah Посмотреть сообщение
Безымянные пространства что-то смущают (даже как замена static)
На то они и безымянные. Нет имени - нет доступа в другом модуле.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7002 / 3294 / 448
Регистрация: 04.12.2011
Сообщений: 9,113
Записей в блоге: 5
16.04.2017, 11:59 #12
Цитата Сообщение от Croessmah Посмотреть сообщение
Вот пространства имен призваны решать такие проблемы.
Хороший способ объяснения. Начальник разбрызгивающий слюну ( и пр. жидкости ) особенно хорош. Как-то реалистично всё и ярко. Класс!
Хочу бросить гнутый пятак в копилку.
По сути, добавление к имени префикса пространства/пространств, который может, учитывая их возможную вложенность, достаточно сложен:
Universe::MyGalactic::SolarSystem::MyComputer::MyArrayTest::my_array_size=12345;
это способ увеличить количество символов имени, снижая тем самым вероятность совпадений (конфликтов). Но ведь можно же было бы просто сочинять вот такие имена:
UniverseMyGalacticSolarSystemMyComputerMyArrayTest_my_array_size=12345;
или даже:
efruwetkwerjhnltkhrylkjmtyljtumkjlkumyukljmlm_MY_ARRAY_SIZE=12345;
Однако при произвольном кодировании длинного имени проблема уникальности порождает:
-проблему проверки всех подобных имён которые уже имеются на несовпадение;
-смысловая нагрузка, которую должно бы нести "хорошее" имя требует внимательного посимвольного прочтения и анализа каждого имени;
-сам по себе набор подобных имён утомителен и чреват ошибками, даже с применением копи-паст.
Применение механизма пространств имён даёт мощный инструмент управления уникальностью и простого контроля и набора.
Создавая пространство, можно отнести все имена к одной области. Конфликт пространств решается придумыванием другого префикса имени пространства. После этого, достаточно соблюдать уникальность лишь в пределах самого пространства. Возможность вложенности делает доступным порождение древовидных структур, в которых информация о имени документируется самим именем! Кроме всего, набор специальных директив позволяет подключать пространства целиком. Тут много возражений бывает и наверное, те кто против где-то правы. Но иногда, особенно при написании небольших кусочков, в частности для иллюстрации на форуме, например, это удобно.
2
16.04.2017, 11:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2017, 11:59
Привет! Вот еще темы с решениями:

using namespace std;
Здравствуйте. Я заметил, что многие программисты стараются избегать этой строчки в своих программах. С чем это связанно? И еще...

std:: vs namespace
Тема не для холивара, объясните пожалуйста чем лучше std:: а не using namespace std ? Без namespace std, возникает такая ошибка, но...

using namespace std
using namespace std; скажите плиз что означает ета строка и для чего она нужна?

namespace std
Добрый день. Вычитал что могу использовать любой namespace. Но в другом месте написано что если не использовать std, то не сможет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru