Чтение онлайн

ЖАНРЫ

Справочное руководство по C++

Страустрап Бьярн

Шрифт:

Автоматические объекты инициализируются (§R.12.1) всякий раз, когда управление переходит в блок, где они определены и уничтожаются (§R.12.4) по выходе из этого блока (§R.6.7).

Поименованный автоматический объект не должен быть уничтожен до окончания его блока, точно так же, как не может быть исключен поименованный автоматический объект класса, имеющего конструктор или деструктор с побочным эффектом, даже если кажется, что этот объект не используется.

Аналогично, глобальный объект класса с конструктором или деструктором, имеющими побочный эффект, не может быть исключен, даже если кажется, что он не используется.

Статические объекты инициализируются

и уничтожаются в соответствии с описанием в §R.3.4 и §R.6.7. С некоторыми объектами не связано никакого имени, см. §R.5.3.3 и §R.12.2. Все глобальные объекты имеют класс памяти статический. Локальным объектам и членам класса можно предать класс памяти статический с помощью явного использования спецификации класса памяти static (§R.7.1.1).

R.3.6 Типы

Существуют два вида типов: основные и производные.

R.3.6.1 Основные типы

Существует несколько основных типов. В стандартном заголовочном файле ‹limits.h› задаются в зависимости от реализации минимальные и максимальные значения каждого типа.

Объекты, описанные как символы (char), могут хранить любой элемент из базового набора символов данной машины. Если символ этого набора хранится в символьной переменной, то ее значение равно целому значению кода этого символа. Символы могут явно описываться как unsigned или signed. Обычный char, signed char и unsigned char являются тремя различными типами. Для всех этих трех типов требуется одинаковый объем памяти.

С помощью описаний short int, int и long int можно определить целые трех различных размеров. Для длинных целых требуется памяти не меньше чем для коротких целых, но в реализации или короткие целые, или длинные целые, или и те и другие могут оказаться эквивалентными обычным целым. Обычные целые имеют размер, определяемый системой команд, размеры других целых определяются конкретными потребностями.

Для каждого из типов signed char, short, int и long существует соответствующий беззнаковый тип, который занимает тот же объем памяти и удовлетворяет тем же требованиям выравнивания. Требование выравнивание - это ограничение на значение указателя на данный объект, которое накладывает реализация (§R.5.4).

Беззнаковые целые, описанные как unsigned, подчиняются законом арифметики по модулю 2n, где n число битов, используемое для представления значения. Отсюда следует, что в арифметике беззнаковых не возникает переполнения.

Существует три типа с плавающей точкой: float, double и long double. Тип double гарантирует не меньшую точность представления, чем float, а тип long double гарантирует точность не меньше, чем у double. Характеристики основных типов с плавающей точкой определяются в соответствии с реализацией в стандартном заголовочном файле ‹float.h›.

Типы char, int любых размеров и тип перечисления (§R.7.2) называются целочисленными типами. Целочисленные типы вместе с типами с плавающей точкой образуют арифметические типы.

Тип void задает пустое множество значений. Он используется для обозначения типа функций, которые не возвращают результат. Нельзя описывать объекты с типом void. Любое выражение можно явно преобразовать к типу void (§R.5.4), получившееся выражение можно использовать только как выражение-оператор (§R.6.2), как левый операнд операции запятая (§R.5.18) или в качестве второго или третьего операнда в операции ?: (§R.5.16).

R.3.6.2 Производные типы

Существует

потенциально бесконечное число производных типов, которые строятся из основных типов следующими способами:

массив объектов данного типа, §R.8.4;

функции, имеющие параметры данного типа и возвращающие объекты данного типа, §R.8.2.5;

указатели на объекты или функции данного типа, §R.8.2.1;

ссылки на объекты или функции данного типа, §R.8.2.2;

константы, являющиеся значениями данного типа, §R.7.1.6;

классы, содержащие совокупность объектов различных типов (§R.9), набор функций для управления этими объектами (§R.9.3) и и список ограничений на доступ к этим объектам и функциям, §R.11;

структуры, которые являются классами без стандартных ограничений на доступ, $$r.11;

объединения, которые являются структурами, способными содержать в разное время объекты различных типов, §R.9.5;

указатели на члены классов, которые задают члены данного типа среди всех объектов данного класса, §R.8.2.3.

В общем случае указанные методы построения объектов могут применяться рекурсивно, ограничения приведены в $$r.8.2.1, §R.8.2.4, §R.8.2.5 и §R.8.2.2.

Про указатель на объекты типа T говорят "указатель на на T". Например, про указатель на объект типа int говорят "указатель на int", а указатель на объект класса X называется "указатель на X".

Объекты типа void* (указатель на void), const void* и volatile void* могут использоваться как указатели на объекты неизвестного типа. Объект типа void* должен иметь достаточно памяти, чтобы хранить указатель на любой объект.

Все фрагменты руководства, говорящие об "указателях", не относятся к указателям на члены, за исключением указателей на статические члены.

R.3.6.3 Имена типов

Основные и производные типы можно поименовать с помощью механизма typedef (§R.7.1.3), а семейство типов и функций можно задать и поименовать с помощью механизма шаблона типов (§R.14).

R.3.7 Адреса

Любой объект - это некоторая область памяти, адрес - выражение, ссылающееся на объект или функцию. Очевидным примером адреса будет имя объекта. Существуют операции, порождающие адреса, например, если E выражение типа указатель, то *E - адресное выражение, соответствующее объекту, на который указывает E. Термин "адрес" ("lvalue" т.е. left value - левая величина) появляется из оператора присваивания E1 = E2, где левый операнд E1 должен "адресовать" изменяемую переменную. При обсуждении всех операций в §R.5 указывается применимы ли они к адресным операндам и порождают ли они сами адреса. Адрес может изменяться, если он не является именем функции, именем массива или const.

R.4 Стандартные преобразования

Некоторые операции в зависимости от своих операндов могут вызвать преобразование значения операнда от одного типа к другому. Здесь описываются преобразования, вызванные самыми обычными операциями, и объясняется каковы могут быть результаты таких преобразований. По мере надобности будут даны дополнительные объяснения при обсуждении каждой операции. Подобные преобразования также происходят при инициализации (§R.8.4, §R.8.4.3, §R.12.8, §R.12.1). В §R.12.3 и §R.13.2 описываются преобразования, заданные пользователем, и их соотношения со стандартными преобразованиями. В результате преобразования может получиться адрес, только если результат есть ссылка (§R.8.2.2).

Поделиться с друзьями: