для использования cout
, Я должен указать обоих:
#include<iostream>
и
using namespace std;
Где cout
определенный? в iostream
, корректный? Так, это - это iostream
самостоятельно есть ли в пространстве имен std
?
Что значение обоих является операторами относительно использования cout
?
Я смущен, почему мы должны включать их обоих.
iostream
- это имя файла, в котором определен cout.
С другой стороны, std
- это пространство имен, эквивалентное ( в некотором смысле) в пакет java.
cout - это экземпляр, определенный в файле iostream
внутри пространства имен std.
В другом пространстве имен может существовать другой экземпляр cout
. Итак, чтобы указать, что вы хотите использовать экземпляр cout
из пространства имен std
, вы должны написать
std :: cout
, указывая область видимости.
std::cout<<"Hello world"<<std::endl;
Чтобы избежать повсеместного использования std ::
, вы можете использовать предложение using
.
cout<<"Hello world"<<endl;
Это разные вещи.Один указывает область действия, другой - фактическое включение cout
.
Представьте, что в iostream существуют два экземпляра с именем cout
в разных пространствах имен
namespace std{
ostream cout;
}
namespace other{
float cout;//instance of another type.
}
После включения
вам все равно понадобится чтобы указать пространство имен. Оператор #include
не говорит: «Эй, используйте cout в std ::». Это то, для чего используется
, чтобы указать область действия
Если ваша реализация на C ++ использует файлы заголовков в стиле C (многие так и делают), то существует файл, содержащий что-то похожее на:
#include ... // bunches of other things included
namespace std {
... // various things
extern istream cin;
extern ostream cout;
extern ostream cerr;
... // various other things
}
std - это пространство имен, которое в стандарте C ++ говорится, что большинство стандартных вещей должны находиться в нем. Это сделано для того, чтобы не переполнять глобальное пространство имен, что может вызвать трудности с придумыванием имен для ваших собственных классов, переменных и функций, которые еще не используются в качестве имен для стандартных вещей.
Говоря
using namespace std;
, вы сообщаете компилятору, что хотите, чтобы он выполнял поиск в пространстве имен std в дополнение к глобальному пространству имен при поиске имен. Если компилятор видит исходную строку:
return foo();
где-то после строки using namespace std;
он будет искать foo
в различных разных пространствах имен (аналогично scopes), пока не найдет foo, отвечающий требованиям этой строки. Он ищет пространства имен в определенном порядке.Сначала он просматривает локальную область видимости (которая на самом деле является безымянным пространством имен), затем следующую самую локальную область видимости до тех пор, пока она не выходит за пределы функции, затем на именованные объекты охватывающего объекта (в данном случае методы), а затем на глобальные имена (функции, в данном случае, если вы не были глупыми и перегруженными (), которые я игнорирую), а затем в пространстве имен std, если вы использовали строку using namespace std;
. У меня могут быть последние два в неправильном порядке (std можно искать до global), но вам следует избегать написания кода, который зависит от этого.
#include
ссылается на файл заголовка, который определяет cout. Если вы собираетесь использовать cout, вам всегда понадобится include.
Вам не нужно использовать пространство имен std;
. Это просто позволяет вам использовать сокращенные обозначения cout
и endl
и т.п., а не std :: cout
и std :: endl
где пространство имен явное. Лично я предпочитаю не использовать using namespace ...
, так как это требует от меня явного объяснения, хотя, по общему признанию, это более многословно.
cout
логически определяется в iostream. По логике я имею в виду, что он может быть в файле iostream или в каком-то файле, включенном из iostream. В любом случае включение iostream - это правильный способ получить определение cout
.
Все символы в iostream находятся в пространстве имен std
. Чтобы использовать символ cout
, вы должны указать компилятору, как его найти (т.е. какое пространство имен). У вас есть два варианта выбора:
// explicit
std::cout << std::endl;
// import one symbol into your namespace (other symbols must still be explicit)
using std::cout;
cout << std::endl;
// import the entire namespace
using namespace std;
cout << endl;
// shorten the namespace (not that interesting for standard, but can be useful
// for long namespace names)
namespace s = std;
s::cout << s::endl;