0

C++ の静的クラス メンバーに関する質問があります。私の C++ の理解に基づいて、静的クラス番号は、クラスのインスタンスが作成される前に存在するはずです。const 静的メンバー変数を初期化することは可能ですが、非 const 静的メンバーの場合、クラス内で初期化することはできません。したがって、私の質問は、非 const 静的クラスをどこで初期化する必要があるかです。次のコードが示すように、非 const 静的クラスの唯一の段階は、メイン プログラムが実行される前にあるようです。

    using namespace std;
    class C
    {
    public:
        static int Value;

    };

    int C::Value = 2;

    int main()
    {
        // int C::Value = 2; //ERROR!
        cout<<C::Value<<endl; 
        return 0;
    }

それを初期化する他の方法はありますか?ありがとう!

4

2 に答える 2

2

C++ プログラムの非ローカル オブジェクトは、静的および動的に初期化できます。簡単に言えば、静的初期化は、本質的にコンパイル時に実行される (したがって、コードを生成しない) 定数式を使用した単純な C スタイルの初期化です。一方、動的初期化は、実行時に実行する必要があるいくつかの重要なアクションを含む初期化です。

静的に初期化されたオブジェクトは、初期化済みの状態でその寿命を開始すると想定できます。つまり、概念的には、プログラムの開始時に即座に初期化されます。

動的な初期化の時間と順序に関しては、静的クラス メンバーは他の名前空間スコープ オブジェクトと同じように扱われます。言語は、静的記憶域期間を持つすべてのオブジェクトが の前に初期化されることを保証しませんmain。代わりに、言語は、同じ翻訳単位で定義された関数またはオブジェクトを最初に使用する前に、そのような静的オブジェクトが初期化されることを保証します。同じ翻訳単位で定義された静的オブジェクトは、定義された順に初期化されます。動的初期化のルールでは、前述の「初期化順序の大失敗」が許容されます。

あなたの例 -int整数定数式によって初期化されたオブジェクト- では、静的初期化が使用されます。このintオブジェクトは、すでに初期化された状態でその寿命を開始すると想定しても安全です。

于 2012-10-29T23:26:47.400 に答える
1

あなたはほとんど頭に釘を打ちました。

定義は の前後どちらに書いても構いませんmain。実際、静的な初期化順序の大失敗を考慮に入れることは別として、宣言(つまり、クラス定義内のその行) がメンバーを使用する場所で可視である限り、それをどこに書くかはまったく問題ではありません。クラス定義と同じスコープで行う限り。

于 2012-10-29T17:44:16.720 に答える