Я новичок в программировании, и я часто вижу много программ, использующих префикс std
, если они используют какие-либо функции std
, такие как std::cout
, std::cin
и т. д. Мне было интересно, для чего это нужно? Это просто способ хорошего программирования или есть нечто большее? Имеет ли это какое-то значение для компилятора или это читабельность или что? Спасибо.
Какая необходимость указывать префикс std?
Ответы (5)
Типы и функции STL определены в пространстве имен с именем std
. Префикс std::
используется для использования типов без полного включения пространства имен std
.
Вариант 1 (используйте префикс)
#include <iostream>
void Example() {
std::cout << "Hello World" << std::endl;
}
Вариант №2 (использовать пространство имен)
#include <iostream>
using namespace std;
void Example() {
cout << "Hello World" << endl;
}
Вариант №3 (используйте типы по отдельности)
#include <iostream>
using std::cout;
using std::endl;
void Example() {
cout << "Hello World" << endl;
}
Примечание. Существуют и другие последствия включения всего пространства имен C++ (вариант № 2), кроме отсутствия необходимости добавлять префикс std::
к каждому типу/методу (особенно если это делается в файле заголовка). Многие программисты на C++ избегают этой практики и предпочитают №1 или №3.
std::swap
, потому что using std::swap; swap(a,b);
— это способ гарантировать, что вы получите перегруженный ADL swap
, если он существует, и скучный старый std::swap
, если его нет. std::swap
может быть специализирован для пользовательских классов по одному, но для пользовательских шаблонов классов ADL является единственным законным способом предоставления пользовательского обмена. Однако семантика перемещения как бы решает эту проблему, возможно, этот стиль использования std::swap
может измениться в C++0x.
- person Steve Jessop; 09.03.2011
std
есть вещи, которых не было в STL.)
- person Kristopher Johnson; 09.03.2011
STL
здесь неправильный термин. Он только применяется к частям контейнеров и алгоритмов стандартной библиотеки. Ничего больше. (см. Страуструп/Саттер/Мейерс/и т. д.)
- person Galik; 19.12.2017
C++ имеет концепцию пространств имен.
namespace foo {
int bar();
}
namespace baz {
int bar();
}
Эти две функции могут сосуществовать без конфликтов, поскольку они находятся в разных пространствах имен.
Большинство стандартных библиотечных функций и классов находятся в пространстве имен "std". Для доступа, например. cout вам необходимо выполнить одно из следующих действий в порядке предпочтения:
std::cout << 1;
using std::cout; cout << 1;
using namespace std; cout << 1;
Причина, по которой вам следует избегать using
, демонстрируется приведенными выше пространствами имен foo и baz. Если бы у вас был using namespace foo; using namespace baz;
, любая попытка позвонить bar()
была бы неоднозначной. Использование префикса пространства имен является явным и точным и является хорошей привычкой.
Никто не упомянул в своем ответе, что оператор using namespace foo
можно поместить внутрь тела функции, тем самым уменьшив загрязнение пространства имен в других областях.
Например:
// This scope not affected by using namespace statement below.
void printRecord(...)
{
using namespace std;
// Frequent use of std::cout, io manipulators, etc...
// Constantly prefixing with std:: would be tedious here.
}
class Foo
{
// This scope not affected by using namespace statement above.
};
int main()
{
// This scope not affected either.
}
Вы даже можете поместить оператор using namespace foo
в локальную область видимости (пара фигурных скобок).
Это функция С++, называемая пространствами имен:
namespace foo {
void a();
}
// ...
foo::a();
// or:
using namespace foo;
a(); // only works if there is only one definition of `a` in both `foo` and global scope!
Преимущество в том, что может быть несколько функций с именами a
— пока они находятся в разных пространствах имен, их можно использовать однозначно (например, foo::a()
, another_namespace::a()
). Для этой цели вся стандартная библиотека C++ находится в std
.
Используйте using namespace std;
, чтобы избежать префикса, если вы можете столкнуться с недостатками (конфликты имен, менее понятно, к чему относится функция, ...).
Это сокращение от стандартного пространства имен.
Вы можете использовать:
using namespace std
если вы не хотите продолжать использовать std::cout и просто используете cout
std::
предпочтительнее using namespace std
- person Tim; 09.03.2011