Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
___2_Пособие по Языку С++.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.34 Mб
Скачать

13. Объявления объектов и типов

При объявлениях можно использовать одновременно более одного модификатора (это * [ ] и ( ) ). Это даёт возможность создавать бесконечное множество сложных описателей типов. В то же время, некоторые комбинации недопустимы:

элементами массива не могут быть функции;

функции не могут возвращать массив или функцию.

При интерпретации сложных описателей квадратные и круглые скобки (справа от идентификатора) имеют приоритет перед * (слева от идентификатора). Квадратные или круглые скобки имеют один и тот же приоритет.

Спецификатор типа рассматривается на последнем шаге. Можно использовать круглые скобки, чтобы изменить порядок интерпретации на необходимый. Для правильной интерпретации сложных описателей можно придерживаться следующего правила («изнутри - наружу»).

Начать с идентификатора и посмотреть вправо, есть ли квадратные или круглые скобки.

Если они есть, то проинтерпретировать эту часть описателя и затем посмотреть налево в поиске *.

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

Интерпретировать спецификатор типа.

Например, при использовании конструкции

int *(*array[10]) ( );

объявляется имя array как массив из 10 указателей на функцию без аргументов, возвращающую указатель на целое значение.

14. Имена типов

В некоторых конструкторах языка явно используются имена типов (операции sizeof, new, cast). Имя типа – это просто объявление объекта такого типа, в котором опущено имя самого объекта.

Примеры имён типов:

int - целое

double - плавающее с двойной точностью

int * - указатель на целое

int * [10] - массив указателей на целое

int(*)[10] - указатель на массив на 10 целых

int * (void) - функция без аргументов, возвращающая указатель на целое.

int (*) (void) - указатель на функцию без аргументов, возвращающую результат целого типа.

15. Синоним имени типа

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

int INTEGER; // INTEGER - имя переменной типа int

typedef int INT; // INT – синоним типа int

typedef unsigned size_t;

typedef char string [255];

typedef void (*FPTR) (int);

Последние две строки определяют string как синоним типа «строка из 255 символов», а FPTR – синоним типа «указатель на функцию, имеющую один аргумент типа int и не возвращающую никакого результата.»

После объявления с помощью typedef новое имя становится полноценным именем типа:

string array; // array – массив из 255 символов

FPTR func_pointer; // void (*func_pointer)(int);

typedef string STRING;

Использование typedef может упростить понимание сложных имен типов. Так, тип int (*(void))[ ] можно построить так:

typedef int intarray[]; // тип «массив целых»

typedef intarray * ptrtointarray; //тип указателя на массив целых

typedef ptrtointarray TYPE (void);

Теперь имя TYPE можно использовать, например, в прототипах:

double fun (int, int, TYPE);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]