C++ для начинающих.

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-й части? Если да, то как это пояснить?