Общие сведения о деклараторов
Деклараторы компоненты объявления, указывающих имена объектов или функций.Деклараторы также определяют ли именованный объект объект, ссылка указателя или массива.Деклараторы еще не определяют базовый тип, они изменяют данные о типе в базовом типе, чтобы определить производные типы, такие как указатели, ссылки и массивы.При применении к функциям, декларатор работает с описателем типа полностью, чтобы определить возвращаемый тип функции, чтобы быть объектом, указателем или по ссылке.(Описатели, обсуждаемые в пределах Объявлениятип транспорта свойства, как и класс хранения.Модификаторы, описываемые в этом разделе, а также в пределах модификаторы Майкрософт-Специфическогоизмените деклараторы.) На следующем рисунке показано полное объявление MyFunctionи вызовы компонентов вне объявления.
Описатели модификаторы деклараторы, и
Только для систем Microsoft
Большинство ключевые слова расширенные Майкрософт можно использовать в качестве модификаторов для формирования производные типы. они не описателей или деклараторов.(См. модификаторы Майкрософт-Специфического.)
ЭЛЕМЕНТ, относящийся Майкрософт
Деклараторы отображаются в синтаксис объявления после того как необязательный список описателей.Эти описатели обсуждаются in объявления. Объявление может содержать несколько декларатор, но каждый декларатор объявляется только одно имя.
Следующее объявление образца показано, как описатели и деклараторы объединяются для формирования полное объявление:
const char *pch, ch;
В предыдущем объявлении ключевые слова Const и char создание списка описателей.В списке декларатора: 2 *pch и ch.Объявление, которое объявляет несколько сущностей состоит из описателя типа, за которым следует список с разделителями-запятыми деклараторов завершенным, точкой с запятой.
деклараторы для простых объектов
Декларатор простого объекта как int или double просто имя его с дополнительными скобки.
int i; // declarator is i
int (i); // declarator is (i)
деклараторы для указателей, ссылок и массивов
Операторы указателя, вставленные перед именем вызывают объект быть указателем или по ссылке.* оператор объявляет имя как указатель. & оператор объявляющему его в качестве ссылки.
int *i; // declarator is *i
int &i; // declarator is &i
int **i; // declarator is **i;
Добавление const OR volatile присвойте указатель эти особые свойства.Использование следующих описателей в деклараторе (в отличие от в описателя типа) изменяет свойства указателя-линии ", не указанного объекта.
char *const cpc; // const pointer to char
const char *pcc; // pointer to const char
const char *const cpcc; // const pointer to const char
Дополнительные сведения можно найти в пределах Указатели const и volatile.
Указатель на член класса или структуры объявлен с соответствующим вложенных описателем имени:
int X::* pIntMember;
int ::X::* pIntMember; // the initial :: specifies X is in global scope
char Outer::Inner::* pIntMember; // pointer to char in a nested class
Брекеты включающего необязательное константное выражение после имени объекта могут быть массивом.Последовательные брекеты объявляют дополнительных измерений в массив.
int i[5]; // array with five elements of type int numbered from 0 to 4
int i[]; // array of unknown size
char *s[4]; // array of pointers to char
int i[2][2]; // two dimensional array
деклараторы для функций
Скобки после имени, содержащий список аргументов используются для объявления функции.Ниже следует объявление функции типа возвращаемого значения int до 3 аргументов типа int.
int f(int a, int b, int c);
Дополнительные сведения о списках см. arguments. объявления функции.
Указатели и ссылки на функции указываются путем добавления указатель или ссылаются на оператор к имени функции, как показано ниже.Требуются круглые скобки, отличающие обычно являются необязательными, указатель на функцию из функции, которая получает указатель.
int (*pf)(int); // pointer to function returning int
int *f(int i); // function returning pointer to int
int (&pf)(int); // reference to function
Указатели различаются функции-членам вложенных описателями имени:
int (X::* pmf)(); // pointer to member function of X returning int
int* (X::* pmf)(); // pointer to member function returning pointer to int
см. также Указателей на члены.
Функции и объекты в одном объявлении
Функции и объекты могут быть объявлены в одном объявлении следующим образом:
int i, *j, f(int k); // int, pointer to int, function returning int
Синтаксис может быть обманчив в некоторых случаях.следующее объявление
int* i, f(int k); // pointer to int, function returning int (not int*)
может выглядеть так, как показано объявление int указатель и возврата функции int*, только в ней нет.Это связано с тем, что часть декларатора для * iне является частью декларатора для f.
Упрощение синтаксис декларатора с typedef
Лучший метод, однако использовать a typedef сочетание и или скобки typedef ключевое слово.Рекомендуется при объявлении массив указателей на функции:
// Function returning type int that takes one
// argument of type char *.
typedef int (*PIFN)( char * );
// Declare an array of 7 pointers to functions
// returning int and taking one argument of type
// char *.
PIFN pifnDispatchArray[7];
Эквивалентное объявление можно переписать без typedef объявление, но она слишком сложные, что вероятность ошибок превышает все преимущества:
int ( *pifnDispatchArray[7] )( char * );
Дополнительные сведения см. в typedef. описатель typedef.
Указатели ссылки, массивы одного базового типа могут быть объединены в одном объявлении (отделенном запятыми)
int i, *i, &i, i[5];
более сложный синтаксис декларатора
Указатель ссылка, массив и деклараторы функции могут объединяться, чтобы определить такие объекты, как массивы указателей на функции, указателей на массивы и т д
Следующая рекурсивная грамматика описывается синтаксис декларатора указателя полностью.
A declarator указывает, что один из:
1. identifier
2. qualified-name
3. declarator ( argument-list ) [cv-qualfiers] [exception-spec]
4. declarator [ [ constant-expression ] ]
5. pointer-operator declarator
6. ( declarator )
- и указатель-оператор один из:
* [cv-qualifiers]
& [cv-qualifiers]
:: nested-name-specifier * [cv-qualfiers]
Поскольку декларатор может содержать деклараторы, можно создать более сложные производные типы, такие как массивы указателей, функции, возвращающие массивы указателей функций, с помощью приведенных выше правил.Для формирования каждый шаг конструкции начните с идентификатором, представляющий базовый тип данных и применить синтаксическое выражение, как правило, выше с предыдущим declarator.Порядок применения синтаксические правила должен быть обратитью способа выражение указано на английском языке.если применить указатель-оператор синтаксическое правило к выражению массива или функции, скобкам использования если требуется указатель на массив или функции, как в последней строке в таблице ниже.
В следующем примере показаны конструкции «указатель на массив указателей на 10 int».
учтное выражение |
Декларатор |
Синтаксическое правило применяется |
---|---|---|
|
1 |
|
указатели |
|
5 |
массив 10 |
|
4 |
указатель на |
|
6 и 5 |
При использовании нескольких модификаторов указателя, массивы или ссылки, функции, деклараторы могут стать довольно осложненными.Раздел Интерпретация более сложные деклараторы описывает, как выполнить чтение более сложный синтаксис декларатора.Раздел применимо как к c# и C++, хотя в C++ в любом месте * используется для указания указатель, полное имя, что и MyClass:: * может использоваться для определения указателя на член класса.