宣言と宣言子
宣言構文:インデックス への移動
宣言は名前の並びです。これらの名前は宣言子または識別子と呼ばれることがあります。宣言は、記憶クラス指定子(省略可能)、型指定子、その他の修飾子から始まります。識別子はカンマで区切られ、その並びはセミコロンで終わります。
変数識別子のシンプルな宣言は、次のようなパターンになります。
data-type var1 <=init1>, var2 <=init2>, ...;
ここで、var1, var2, ... は、省略可能な初期化子を伴う異なる識別子の並びです。変数はそれぞれ、data-type 型として宣言されます。以下に例を示します。
int x = 1, y = 2;
この例では、x と y という 2 つの整数型変数を作成し、それぞれを 1 と 2 という値に初期化しています。
これらはすべて定義宣言であり、記憶域が割り当てられ、オプションの初期化子がすべて適用されます。
当該変数の型と代入互換である値に評価される有効な式であれば、どのようなものでも、自動オブジェクトの初期化子にすることができます。一方、静的オブジェクトの初期化子は、定数または定数式でなければなりません。
C++ では、定数および宣言済みの変数や関数から成る任意の式を静的オブジェクトの初期化子にすることができます。
宣言子の形式は、宣言された名前が式で使用されたときにどのように解釈されるかを示します。以下の宣言で、type は任意の型、storage-class-specifier は任意の記憶クラス指定子、D1 と D2 はそれぞれ任意の宣言子であるとします。
storage-class-specifier type D1, D2;
式に D1 や D2 が現れると、それは type 型で記憶クラスが storage-class-specifier のオブジェクトとして扱われることを、この宣言は示しています。宣言子に埋め込まれている名前の型は、"type"、"type へのポインタ"、"type の配列"、"type を返す関数"、"type を返す関数へのポインタ" など、type を含んだ何らかの表現になります。
たとえば、以下に示す宣言構文の例で、各宣言子は、単一の int オブジェクトが適した式で右辺値(場合によっては左辺値)として使用することができます。埋め込まれている識別子の型は、それぞれの宣言子から以下のように導き出されます。
宣言構文の例:
宣言子の構文 | name の暗黙の型 | 例 |
---|---|---|
type name; |
type |
int count; |
type name[]; |
type の(オープン)配列 |
int count[]; |
type name[3]; |
すべて type 型の 3 つの要素(name[0]、name[1]、name[2])から成る固定配列 |
int count[3]; |
type *name; |
type へのポインタ |
int *count; |
type *name[]; |
type へのポインタの(オープン)配列 |
int *count[]; |
type *(name[]); |
上記と同じ |
int *(count[]); |
type (*name)[]; |
type の(オープン)配列へのポインタ |
int (*count) []; |
type &name; |
type への参照(C++ の場合のみ) |
int &count; |
type name(); |
type を返す関数 |
int count(); |
type *name(); |
type へのポインタを返す関数 |
int *count(); |
type *(name()); |
上記と同じ |
int *(count()); |
type (*name)(); |
type を返す関数へのポインタ |
int (*count) (); |
(*name)[ ] と (*name)( ) にはかっこが必要であることに注意してください。これは、配列宣言子 [ ] と関数宣言子 ( ) はどちらもポインタ宣言子 * より優先順位が高いためです。*(name[ ]) のかっこは省略可能です。
メモ: 宣言子の構文については、CodeGear C++ の宣言構文を参照してください。識別子と関数宣言子が両方とも定義されています。