0

次のサンプルコードを書きました:

class MyClass {
    static int a;
  public:
    MyClass ( int i ) : a ( i )    {
      cout << " \n ctor called. a is : "<< a << " \n";
    }
};

int   MyClass::a = 1;   

int main( ) {
    MyClass my(2);
}

静的データメンバーはコンストラクター初期化子リストで使用できないため、これによりコンパイルエラーが発生することはわかっています。

では、クラスのオブジェクトが作成されるたびに静的データ メンバーを初期化する方法は? コンストラクターから呼び出される静的メンバー関数でそれができることを願っています。それが唯一可能な方法ですか?

4

4 に答える 4

5

シンプルに、コンストラクターの本体に値を割り当てます。a

MyClass ( int i )  {
  a = i;
  cout << " \n ctor called. a is : "<< a << " \n";
}

は初期a化されておらず、単に新しい値が割り当てられているため、初期化子リストを使用してこれを行うことはできません。コンストラクターが呼び出される前、プログラムの開始時に、値 0 に初期化されます (初期化されいない変数は 0 に設定されます)。astatic

これは、コンパイラが教えてくれることであり、かなり単純です。

エラー: 'int MyClass::a' は静的データ メンバーです。その定義でのみ初期化できます

ちょっとばかげているように思えますがstatic、それはインスタンス変数ではなく、そうであるべきだと思いますか? 変数のインスタンスは、staticプログラム全体に 1 つだけ存在し、プログラムの実行の開始からプログラムの終了まで存続します。

編集:staticコメントの1つを見ると、変数のインスタンスが1つしかないことに気付いているようです。初期化割り当ては 2 つの異なるものであることに注意してください。

于 2011-12-09T10:37:34.507 に答える
2

キーワード static は、メンバー変数が各クラス インスタンスに対して独自の値を持つのではなく、記述したコード行で初期化される 1 つの値を持つことを示します。

int   MyClass::a = 1;

コンストラクターの目的はインスタンスを初期化することですが、静的変数メンバーはインスタンスと関係がないため、非静的メンバーの初期化に使用される初期化リストでそれらを初期化することはできません。コンストラクターの初期化リストにない値を変数に割り当てる場合、変数は静的であるため、変数の値を置き換えるだけです。

詳しくはこちらをご覧ください: http://www.bogotobogo.com/cplusplus/statics.php

于 2011-12-09T10:39:57.037 に答える
1

静的メンバー変数は、クラスのすべてのインスタンスで同じままであると想定されています。コンストラクターで変更する場合は、通常のメンバー変数を使用します。

しかし、あなたの質問に答えるには: はい、変数を設定できるように静的メンバー関数を呼び出すことができます。または、初期化子リストではなく、関数の本体に設定します。

于 2011-12-09T10:38:33.123 に答える
0

How to initialize the static data member each time an object of the class is created?

これはできません。静的データメンバーは、クラスのオブジェクト/インスタンスの一部ではありませんが、それ自体がオブジェクトであり、通常はプログラムの開始時に一度だけ作成および初期化されます。新しいクラス インスタンスの作成時にできることは、それに新しい値を割り当てることです。(しかし、問題は、なぜこれを行うのかということです。インスタンス固有である必要がある非静的メンバーを使用します。静的メンバーは、クラスのすべてのインスタンス間で共有されます)。

非 const static int メンバーはファイル スコープで定義する必要があり、例で行ったように明示的に初期化できる場所です。initializer( ) を省略1した場合、変数は静的な期間を持つため、コンパイラによって で初期化されます0

于 2011-12-09T11:03:34.613 に答える