宣言の概要

宣言はオブジェクトまたは関数の名前を指定する宣言のコンポーネントです。宣言は名前付きオブジェクトがオブジェクト参照ポインターまたは配列型であるかどうかを指定します。宣言で基本型を指定しないとポインター参照配列などの派生型を指定する基本型の型情報を変更します。完全に関数の戻り値の型をオブジェクトのポインターである場合を指定するには型指定子を持つ関数宣言子作業または参照に適用されます。(宣言 で説明した指定子は型やストレージ クラスなどのプロパティを行います。このセクションに Microsoft 固有の修飾子 で説明する修飾子は宣言を変更します。次の図は MyFunction の宣言全体を表し宣言のコンポーネントについて。

指定子修飾子と宣言

指定子、修飾子、宣言子

Microsoft 固有の仕様 →

ほとんどの修飾子として " Microsoft 拡張されるキーワードは派生型を形成するために使用できます。; これらは指定子または宣言ではありません。(Microsoft 固有の修飾子 を参照してください)。

終了 Microsoft 固有の仕様→

宣言は指定子のオプションの一覧の後に宣言の構文に表示されます。これらの指定子は 宣言。 について説明します。宣言は複数の宣言を含めることができますが各宣言は1 種類の名前で宣言します。

次のように宣言全体を形成指定子と宣言を結合する方法を示します :

const char *pch, ch;

上のように宣言するとキーワード 定数 とは 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 または 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 の 3 個の引数の関数を宣言します。

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 のポインターや関数の宣言に示すようには指定できません。これは* f の宣言の i の宣言の一部ではなく一部です。

型定義の宣言の構文を簡略化

ただしより良い方法はかっこと typedeftypedef またはキーワードの組み合わせを使用します。関数へのポインターの配列を宣言することを検討します :

//  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 * );

型定義の詳細については型定義の指定子 を参照してください。

ポインター参照一つの基本型の配列は一つの宣言で (コンマで区切って組み合わせて実行できます)

int i, *i, &i, i[5];

より複雑な宣言の構文

  • ポインター参照配列および関数の宣言は配列へのポインター関数ポインター指定するには保存された配列などのオブジェクトを組み合わせることがあります。

  • 次の再帰的な文法はポインターの宣言の構文を完全について説明します。

  • declarator は 1 回で定義されています :

1. identifier 
2. qualified-name 
3. declarator ( argument-list ) [cv-qualfiers] [exception-spec]
4. declarator [ [ constant-expression ] ] 

5. pointer-operator declarator 
6. ( declarator )
  • ポインター演算子は 一つです : 1
* [cv-qualifiers]
& [cv-qualifiers]
:: nested-name-specifier * [cv-qualfiers]

宣言は宣言を含む可能性があるためポインターの配列上記の規則を使用して関数ポインターの配列を返す関数などより複雑な派生型を構築することがあります。コンストラクターの各ステップを形成し基本型を表す識別子から開始し前の式と declarator として上記の構文規則を適用します。構文規則を適用する順序は式が英語で説明されている方法で反転必要があります。 ポインター演算子の 構文規則を配列または関数式に適用する場合は配列または関数へのポインターが必要な場合は次の表の最後の行に示すようにかっこを使用します。

次の例では「 10 の整数へのポインターの配列へのポインター」構造を示しています。

ことばして式

宣言

適用される構文の規則

i

1

へのポインター

*i

5

10 の配列

(*i)[10]

4

へのポインター

*((*i)[10])

次に6および 5

複数のポインター参照配列または関数の修飾子を使用すると宣言により複雑になる場合があります。トピック より複雑な宣言の解釈 はより複雑な宣言構文を読み取る方法について説明します。トピックではC++ では任意の * MyClass などの修飾名のポインターを示すために使用されるC と C++ の両方に当てはまります :: * クラスのメンバーへのポインターを指定するために使用される場合があります。

参照

関連項目

宣言子