次の方法で共有


宣言と定義 (C++)

宣言では、プログラムの要素または名前の存在をコンパイラに通知します。 定義では、その名前で記述されるコードまたはデータを指定します。 名前を使用するには、先にその名前を宣言する必要があります。

宣言

宣言は、プログラムに 1 つ以上の名前を導入します。 宣言は、プログラムに複数回記述できます。 そのため、クラス型、構造体型、列挙型、およびその他のユーザー定義型を、コンパイル単位ごとに宣言できます。 この複数回の宣言に対する制約として、すべての宣言は同じである必要があります。 宣言は、その宣言が以下に当てはまる場合を除いて、定義にもなります。

  1. 宣言が関数プロトタイプ (関数本体のない関数宣言) である。

  2. 宣言が extern 指定子を含んでいるが、初期化子 (オブジェクトや変数) や関数本体 (関数) を含んでいない。 これは、現在の翻訳単位内に定義が存在するとは限らないことを示しており、宣言された名前は外部リンケージを持ちます。

  3. クラス宣言内の静的データ メンバーの宣言である。

    静的クラスのデータ メンバーは、クラスのすべてのオブジェクトで共有される個別の変数であるため、クラス宣言の外側で定義し、初期化する必要があります (クラスおよびクラス メンバーの詳細については、「クラス」を参照してください)。

  4. 後ろに定義が続かない、class T; などのようなクラス名の宣言である。

  5. 宣言が typedef ステートメントである。

定義でもある宣言の例を次に示します。

// Declare and define int variables i and j.
int i;
int j = 10;

// Declare enumeration suits.
enum suits { Spades = 1, Clubs, Hearts, Diamonds };

// Declare class CheckBox.
class CheckBox : public Control
{
public:
            Boolean IsChecked();
    virtual int     ChangeState() = 0;
};

定義でない宣言のいくつかを次に示します。

extern int i;
char *strchr( const char *Str, const char Target );

定義

定義とは、オブジェクトまたは変数、関数、クラス、または列挙子の一意な仕様です。 定義は一意である必要があるため、1 つのプログラムに含められるの特定プログラム要素の定義は、1 つだけです。 宣言と定義は、多対一の対応関係を持つことができます。 プログラム要素を定義しないで宣言できるケースとして、次の 2 つがあります。

  1. 関数が宣言されても、関数呼び出しや関数のアドレスを受け取る式で参照されない場合。

  2. クラスが、そのクラスの定義を知っている必要のない方法でのみ使用される場合。 ただし、そのクラスは、宣言されている必要があります。 このような場合のコードを次に示します。

    // definitions.cpp
    class WindowCounter;   // Forward reference; no definition
    
    class Window
    {
       // Definition of WindowCounter not required
       static WindowCounter windowCounter;
    };
    
    int main()
    {
    }
    

参照

関連項目

基本的な概念