4

.cppファイルには多数のクラス定義があります。1つのクラスには、次のようにプライベート静的メンバーがあります。

class SomeClass:public SomeParentClass
{
   private:
     static int count;
};

クラスが定義された直後に、count属性は次のようにゼロに初期化されます。

int SomeClass::count = 0;

Java / C#の世界から来て、どの時点でcountゼロに初期化されるのか理解するのに問題がありますか?SomeClassインスタンス化されたときですか?また、クラス定義のcount型はであるのにint、なぜその前にSomeClass::countを持たなければならないのintですか?

そして私の最後の質問は、count属性はプライベートなので、クラス定義の外で初期化されたときにその可視性を制限すべきではないかということです。

ありがとう

4

3 に答える 3

4
  1. クラスの静的メンバーは、プログラムの起動時に任意の順序で初期化されます
  2. static int count;クラスの は静的変数の宣言int SomeClass::count = 0;であり、はその定義です。C++ のすべての定義では、型を指定する必要があります。
  3. カウントの定義がファイル スコープで発生したように見えるという事実は、SomeClass::count宣言されているように、実際のスコープは非公開のままです。
于 2012-07-11T04:33:16.510 に答える
3

クラス静的変数は、プログラムの開始時に0に初期化されているかのように動作します。クラスのインスタンス化とは無関係です。

C ++言語では、宣言の識別子の前に型が必要です。

クラス静的変数を初期化するC++構文では、グローバルのように見えますが、変数へのアクセスはコンパイル中に強制されます。

于 2012-07-11T04:28:18.340 に答える
3
SomeClass がインスタンス化されたときですか?

いいえ、インスタンス化の前に (関数が のプライベート メンバーSomeClass::countに対する権利を持っていると仮定して) 経由でアクセスできます。SomeClassオブジェクトの作成を開始する前に十分に使用できます。


SomeClass::count の前に int が必要なのはなぜですか?

まあ、それはint. 関数のプロトタイプと定義を作成するときのことを考えてみてください。

int func (int);
int func (int i) {return 1;} //you still need the int and (int i) here
func {return 1;} //NOT VALID - this is what count would be without int

count 属性は非公開であるため、その可視性は非公開であるべきではありません   
クラス定義の外で初期化すると制限されますか?

この回答によると、静的変数の定義は、通常の方法で定義された場合のアクセス指定子の例外です。

于 2012-07-11T04:30:30.107 に答える