2

私はC++のFAQを読んでいます。第16章「静的の使用」では、次のように述べています。

「const静的データメンバーはクラスで宣言され、通常は.cppファイルなどのソースファイルで定義(および初期化)されます。ただし、場合によっては、クラス本体で初期化できます。」

次に、整数型と非整数型を宣言できる場所について説明します(ただし、これはC ++ 11の積分では変更されたと思います)。

私の質問は、上記はconst静的データメンバーにのみ適用され、非const静的データメンバーには適用されないのですか?

私は本当に混乱し始めており、なぜこれらの制限があるのか​​わかりませんか?揮発性、可変性、およびその他のキーワード変数に関するこれらのルールはありますか?誰かがこれを簡単に学ぶことができますか(24時間年中無休でプログラミングする以外に)?

4

2 に答える 2

3

C ++ 2011は、変数の宣言に関して何も変更していません。ただし、クラス定義の本体ですべてのメンバー変数を初期化できます。オブジェクトを作成する場合、クラス定義で宣言されている値は、デフォルトで使用される値です。ただし、メンバー初期化子リストにメンバーが記載されている場合は、初期化子リストが優先されます。

通常、静的データメンバーを定義する必要があります。ただし、staticメンバーconstはクラス本体での宣言と初期化を回避できます。メンバーが参照にバインドされていないか、そのアドレスが取得されていない場合は、宣言で十分であり、定義を指定する必要はありません。ただし、アドレスを取得する場合は、それでも定義する必要があります。

メンバー初期化のデフォルトを設定する方法の例を次に示します。

class foo
{
private:
    int i{5};
    int j = 6;
    std::vector<int> v{ 1, 2, 3, 4 };
    std::vector<int> w = std::vector<int>(2, 10);
    std::vector<int> z = decltype(z)(2, 10);

    // ...
};

括弧の使用は機能しないことに注意してください。したがって、上記の最後の2つの形式のいずれかを使用する必要がある場合があります。

于 2013-01-03T22:11:05.270 に答える
1

一般的な理由は、ストレージが必要な場合はソースファイルで定義する必要があるということです。静的const整数の場合、ストレージは必要ありません。コンパイラーは、変数を使用するすべての場所でリテラル整数に置き換えることができます。非静的の場合、各オブジェクトにストレージを必要とするメンバー変数です。非定数の場合は、更新時に値を保持する場所が必要です。

于 2013-01-03T22:07:47.207 に答える