声明概述
声明为指定对象或函数的名称声明的元素。声明指定命名对象是否为对象,指针,也引用或排列。在声明不指定该基类型时,他们修改该基类型的类型信息指定派生的类型 (如指针,引用和数组。适用于函数,声明类型说明符一起使用完全指定函数的返回类型是对象,指针或引用。(说明符,讨论在 声明,表示属性 (如类型和存储类。修饰符,讨论本节和在 特定于 Microsoft 的修饰符,修改声明。)下图显示 MyFunction的完整说明,并调用该声明的元素。
说明符、和修饰符声明
Microsoft 专用
大多数 Microsoft 扩展的关键字可用作修饰符窗体派生的类型;它们不是说明符或声明。(请参见 特定于 Microsoft 的修饰符。)
特定于 Microsoft 的结尾
声明出现在声明语法在选项卡后列出说明符。这些说明符在 说明。讨论声明可以包含多个声明,但是,每个声明只声明一个名称。
下面的示例声明显示说明符和声明如何组合形成完整声明:
const char *pch, ch;
在前面的说明,关键字 const 和 char 排列列表说明符。" 公告 " 列表: *pch 和 ch。声明多个实体包括后跟类型的说明符逗号分隔列表声明的说明,停止由分号分隔。
简单对象的声明
一个简单的对象的声明 (int 或二进制文件是其名称,使用选项括号。
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 或 volatile 为指针这些特殊特性。使用在声明中的这些说明符 (带有在类型说明符) 相对修改指针,指向的不是对象的属性设置为:
char *const cpc; // const pointer to char
const char *pcc; // pointer to const char
const char *const cpcc; // const pointer to const char
详细信息。 常数和变量的指针能找到。
对类或结构的成员的指针声明与适当的嵌套名称说明符:
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 和类型 int的三个参数。
int f(int a, int b, int c);
有关的信息参数列表,请参见 函数声明。
指针和对函数通过预置指针声明或引用运算符传递给函数名如下所示。通常,选项,需要括号区分指向函数返回指针的函数:
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 的声明语法
较好的技术,但是,是使用 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];
更复杂的声明语法
指针,引用,排列,因此,函数声明可以将指定此类对象与数组指向函数的指针,指向数组等。
下面的递归语法全面介绍指针声明语法。
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。该命令将语法规则应为表达式指定英语方法的反向功能。如果将 指针运算符 语法规则应用于数组或函数表达式,请使用括号,如果需要指向该数组或函数,在最后一行在下表中。
下面的示例演示 “某些指针的结构为 int 的 10 指针”。
口头表达式 |
声明 |
将的语法规则 |
---|---|---|
|
1 |
|
指针 |
|
5 |
数组 10 |
|
4 |
指针 |
|
6 然后 5 |
当多个指针,引用时,请排列或使用功能修饰符,声明可能变得相当复杂。主题 解释更复杂的声明 描述如何读取更复杂的声明语法。主题适用于 C 和 C++,不过,在 C++ 中,任何位置使用 * 指示指针,限定名例如 MyClass:: * 可用于指定指向类的成员。