Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2017, 15:15   #1
zwei
Новичок
Джуниор
 
Регистрация: 02.09.2017
Сообщений: 1
По умолчанию Несколько вопросов по основам.

Добрый день. Наткнулась на курсы по с++ и возникли вопросы по материалу, но т.к. курсы старые, форум совсем пустой, нужна ваша помощь.
Тут объясняется суть алгоритма:

#include <iostream>

using namespace std;

int main() {
cout << "Hello, World!";
return 0;
}

Следующая строка, using namespace std, говорит, что программа использует стандартное пространство имён (оно называется std). В C++ есть большая стандартная библиотека, и в ней содержится много разных функций, у каждой из которых есть название. Может оказаться, что мы напишем свою функцию, название которой будет совпадать со стандартной, и тогда всё сломается. Если не подключать пространство имен std, то ломаться ничего не будет, но тогда для вызова стандартной функции придётся писать много лишних букв. Но мы не будем называть функции теми же именами, что и стандартные, поэтому нас эта проблема не коснётся.

Возникли следующие вопросы:
Я правильно понимаю это момент, что при условии:
1) я пишу функцию, наим. кот-ой не совпадает с наим. функций из стд библ, то прописывать строку using namespace std не нужно?
2) я пишу функцию (не из стд библ), наим. кот-ой совпадает с функц. из стд библ., и в начале я не прописала строку using namespace std, то ломаться программа не будет?
3) а если я пропишу сначала строку using namespace std и напишу функцию, наим. которой совпадает с наим. ф-ии из стд библ, то программа сломается? так? если функция содержит в себе часть имени функции из стд библ, то программа не будет работать?
4) и если я использую в программе др. функции, но мне понадобилась функция из стд библ, то мне придется писать "много лишних букв" что-бы ее использовать, так как ее наим может совпадать с др. функциями (дабы ничего не сломалось)?
zwei вне форума Ответить с цитированием
Старый 02.09.2017, 19:49   #2
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

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

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

То есть пространства имен можно рассматривать как уточнение имени сущности.
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несколько вопросов Rost93 PHP 18 19.09.2012 19:38
несколько вопросов spydark91 Общие вопросы Delphi 2 18.07.2011 13:48
Несколько вопросов phphel Общие вопросы Delphi 19 30.01.2011 21:24
Несколько вопросов Зубоскалик Общие вопросы Delphi 14 20.11.2008 14:28
Несколько Вопросов Дорст Общие вопросы Delphi 3 12.11.2007 09:18