включайте и пространство имен использования в C++

для использования cout, Я должен указать обоих:

#include<iostream>

и

using namespace std;

Где cout определенный? в iostream, корректный? Так, это - это iostream самостоятельно есть ли в пространстве имен std?

Что значение обоих является операторами относительно использования cout?

Я смущен, почему мы должны включать их обоих.

9
задан Moeb 15 April 2010 в 07:50
поделиться

4 ответа

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 ::». Это то, для чего используется , чтобы указать область действия

9
ответ дан 3 November 2019 в 00:00
поделиться

Если ваша реализация на 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), но вам следует избегать написания кода, который зависит от этого.

2
ответ дан 3 November 2019 в 00:00
поделиться

#include ссылается на файл заголовка, который определяет cout. Если вы собираетесь использовать cout, вам всегда понадобится include.

Вам не нужно использовать пространство имен std; . Это просто позволяет вам использовать сокращенные обозначения cout и endl и т.п., а не std :: cout и std :: endl где пространство имен явное. Лично я предпочитаю не использовать using namespace ... , так как это требует от меня явного объяснения, хотя, по общему признанию, это более многословно.

0
ответ дан 3 November 2019 в 00:00
поделиться

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;
1
ответ дан 3 November 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: