Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник по С++.doc
Скачиваний:
49
Добавлен:
02.05.2014
Размер:
995.33 Кб
Скачать

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).