8.6.4. Стандартное пространство имен std
8.6.4. Стандартное пространство имен std
Все компоненты стандартной библиотеки С++ находятся в пространстве имен std. Каждая функция, объект и шаблон класса, объявленные в стандартном заголовочном файле, таком, как vector или iostream, принадлежат к этому пространству.
Если все компоненты библиотеки объявлены в std, то какая ошибка допущена в данном примере:
#include vector
#include string
#include iterator
int main()
{
// привязка istream_iterator к стандартному вводу
istream_iteratorstring infile( cin );
// istream_iterator, отмечающий end-of-stream
istream_iteratorstring eos;
// инициализация svec элементами, считываемыми из cin
vectorstring svec( infile, eos );
// ...
}
Правильно, этот фрагмент кода не компилируется, потому что члены пространства имен std должны использоваться с указанием их специфицированных имен. Для того чтобы исправить положение, мы можем выбрать один из следующих способов:
* заменить имена членов пространства std в этом примере соответствующими специфицированными именами;
* применить using-объявления, чтобы сделать видимыми используемые члены пространства std;
* употребить using-директиву, сделав видимыми все члены пространства std.
Членами пространства имен std в этом примере являются: шаблон класса istream_iterator, стандартный входной поток cin, класс string и шаблон класса vector.
Простейшее решение – добавить using-директиву после директивы препроцессора #include:
using namespace std;
В данном примере using-директива делает все члены пространства std видимыми. Однако не все они нам нужны. Предпочтительнее пользоваться using-объявлениями, чтобы уменьшить вероятность коллизии имен при последующем добавлении в программу глобальных объявлений.
Using-объявления, необходимые для компиляции этого примера, таковы:
using std::istream_iterator;
using std::string;
using std::cin;
using std::vector;
Но куда их поместить? Если программа состоит из большого количества файлов, можно для удобства создать заголовочный файл, содержащий все эти using-объявления, и включать его в исходные файлы вслед за заголовочными файлами стандартной библиотеки.
В нашей книге мы не употребляли using-объявлений. Это сделано, во-первых, для того, чтобы сократить размер кода, а во-вторых, потому, что большинство примеров компилировались в реализации С++, не поддерживающей пространства имен. Подразумевается, что using-объявления указаны для всех членов пространства имен std, используемых в примерах.
Упражнение 8.14
Поясните разницу между using-объявлениями и using-директивами.
Упражнение 8.15
Напишите все необходимые using-объявления для примера из раздела 6.14.
Упражнение 8.16
Возьмем следующий фрагмент кода:
namespace Exercise {
int ivar = 0;
double dvar = 0;
const int limit = 1000;
}
int ivar = 0;
//1
void manip() {
//2
double dvar = 3.1416;
int iobj = limit + 1;
++ivar;
++::ivar;
}
Каковы будут значения объявлений и выражений, если поместить using-объявления для всех членов пространства имен Exercise в точку //1? В точку //2? А если вместо using-объявлений использовать using-директиву?
2014-05-27 17:41:19 Николай
"1) Для чего используем константу chunk в инструкции выделения памяти? 2) Почему для объекта типа Foo мы выделяем область памяти объекта типа char? Не будет ли в таком случае никаких конфликтов в дальнейшем?" Чтобы выделить определенное количество памяти. В данный буфер можно будет поместить 16 объектов Foo. 2) Потому что размер char - 1 байт (проще считать объем; выделив, например int, надо было бы писать sizeof(Foo)*chunk/4). Проблем не будет.
2012-08-28 16:06:54 Илья
ch8.4.5_Пример "... const int chunk = 16; ... char *buf = new char[ sizeof(Foo) * chunk ]; ... Foo *pb = new (buf) Foo; ..." 1) Для чего используем константу chunk в инструкции выделения памяти? 2) Почему для объекта типа Foo мы выделяем область памяти объекта типа char? Не будет ли в таком случае никаких конфликтов в дальнейшем?
2012-08-28 14:27:16 Илья
ch8.2.3 "...Чтобы это стало возможным, заголовочный файл не должен содержать объявлений встроенных (inline) функций и объектов...." "...Определения символических констант и встроенных функций являются специальными видами определений: те и другие могут появиться в программе несколько раз..." Возникает вопрос, верно ли написано в 1-й части? Если да, то как это пояснить?
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Пространство имен XSL
Пространство имен XSL Заметьте, что элементы XSLT, такие как <xsl:stylesheet>, используют префикс пространства имен (namespace) xsl, который теперь, после стандартизации XSLT, всегда установлен в «http://www.w3.org/1999/XSL/Transform». Это пространство имен обычно устанавливается с атрибутом xmlns (это не
6.3 Пространство имен устройств
6.3 Пространство имен устройств Данное пространство имен развилось за несколько лет существования Windows NT. Для обеспечения обратной совместимости новое пространство имен объединяется со старым пространством с помощью символических ссылок. Кроме того, драйверы режима
Пространство модели и пространство листа
Пространство модели и пространство листа Пространство модели (Model Space) – это пространство AutoCAD, где формируются модели объектов как при двумерном, так и при трехмерном моделировании. О том, что в окне AutoCAD на текущий момент установлено пространство модели, говорят
Пространство имен по умолчанию в Visual Studio 2005
Пространство имен по умолчанию в Visual Studio 2005 В заключение нашего обсуждения пространств имен следует отметить, что при создании нового C#-проекта в Visual Studio 2005 имя пространства имен вашего приложения по умолчанию будет совпадать с именем проекта. При вставке новых
Пространство имен System.Collections.Specialized
Пространство имен System.Collections.Specialized Кроме типов, определенных в пространстве имен System.Collections, библиотеки базовых классов .NET предлагают набор более специализированных типов, определенных в пространстве имен System.Collections.Specialized. Например, типы StringDictionary и ListDictionary обеспечивают
Пространство имен System.Collections.Generic
Пространство имен System.Collections.Generic Обобщенные типы присутствуют во многих библиотеках базовых классов .NET 2.0, но пространство имен System.Collections.Generic буквально наполнено ими (что вполне соответствует его названию). Подобно своему "родственнику" без обобщений (System.Collections),
Пространство имен System.Threading
Пространство имен System.Threading В рамках платформы .NET пространство имен System.Threading предлагает ряд типов, позволяющих строить многопоточные приложения. Вдобавок к типам, с помощью которых можно взаимодействовать с отдельными потоками CLR, в этом пространстве имен определены
ГЛАВА 16. Пространство имен System.IO
ГЛАВА 16. Пространство имен System.IO При создании полноценных приложений исключительно важна возможность сохранения информации между сеансами доступа пользователя. В этой главе рассматривается целый ряд вопросов, связанных с реализацией ввода-вывода в .NET. Первой нашей
Пространство имен System.Resources
Пространство имен System.Resources Ключом к пониманию формата ресурсов .NET является понимание типов, определенных в пространстве имен System.Resources. Соответствующее множество типов обеспечивает программные средства чтения и записи файлов *.resx (в формате XML) и *.resources (в двоичном
Пространство имен System.ComponentModel
Пространство имен System.ComponentModel Пространство имен System.ComponentModel определяет целый ряд атрибутов (и других типов), позволяющих описать то, как должны вести себя ваши элементы управления в режиме проектирования. Например, вы можете указать текстовое описание каждого свойства,
Пространство имен System.Web.Services
Пространство имен System.Web.Services Несмотря на богатые функциональные возможности, обеспечиваемые всеми пространствами имен .NET, связанными с Web-сервисами XML, подавляющее большинство ваших приложений потребует непосредственного взаимодействия только с типами, определенными
Пространство модели и пространство листа
Пространство модели и пространство листа Пространство модели (Model Space) – это пространство AutoCAD, где формируются модели объектов как при двумерном, так и при трехмерном моделировании. О том, что в окне AutoCAD на текущий момент установлено пространство модели, говорят
Пространство имен оболочки
Пространство имен оболочки BrowseCallbackProc Функция BrowseCallbackProc представляет собой определяемую приложением функцию обратного вызова, используемую совместно с функцией SHBrowseForFolder . Диалоговое окно выбора папки вызывает эту функцию для уведомления о событиях. Тип BFFCALLBACK
Пространство модели и пространство листа
Пространство модели и пространство листа Пространство модели (Model Space) – это пространство AutoCAD, где формируются модели объектов как при двумерном, так и при трехмерном моделировании. О том, что в окне AutoCAD на текущий момент установлено пространство модели, говорят
Пространство имен XSLT
Пространство имен XSLT Для того чтобы выделить элементы и атрибуты, которые принадлежат логической схеме XSLT, в этом языке применяется механизм пространств имен. Это означает, что в документе преобразования элементы, относящиеся к XSLT, должны принадлежать его пространству