0
class test {
public:
    static int n;
    test () { n++; };
    ~test () { n--; };
};

int test::n=0; //<----what is this step called? how can a class be declared as an integer?

int main () {
    test a;
    test b[5]; // I'm not sure what is going on here..is it an array?
    test * c = new test;
    cout << a.n << endl;
    delete c;
    cout << test::n << endl;
}

次に、出力は 7,6 です。どのようにして 7 を取得したのかわかりません。どこから?

4

2 に答える 2

2

発言より――

int test::n=0; 

' ::' はスコープ解決演算子と呼ばれます。この演算子は、クラスではなく、静的フィールド n を初期化するためにここで使用されます

于 2015-05-02T20:05:55.893 に答える
1

静的データ メンバーは、クラスで宣言されます。それらはクラスの外で定義されます。

したがって、クラス定義で

class test {

public:
static int n;
test () { n++; };
~test () { n--; };
};

記録

static int n;

n のみを宣言します。メモリを割り当てるように定義する必要があります。この

int test::n=0;

がその定義です。test::nn がクラス test に属することを示す変数の修飾名です。

クラスのオブジェクトが構築されるときのクラス定義に従って、この静的変数は増加します

test () { n++; };

オブジェクトが破棄されると、この静的変数が減少します

~test () { n--; };

実際、この静的変数は、クラスの生きているオブジェクトをカウントする役割を果たします。

したがって、メインでは、クラスのオブジェクトを a という名前で定義しました

test a;

オブジェクトが定義されるたびに、クラスのコンストラクターが呼び出されます。その結果、n が増加し、1 に等しくなります。 5 つのオブジェクトの配列を定義するアダー

test b[5];  

n は 6 になります。

もう 1 つのオブジェクトを動的に割り当てた後

test * c = new test;

n は 7 になります。

明示的な削除後

delete c;

呼び出されたデストラクタが n を減らしたため、n は再び 6 に等しくなります。

于 2015-05-02T20:12:01.830 に答える