2009-08-29 5 views
0
class Foo 
{ 
public: 
    void bar(); 
}; 

void Foo::bar() 
{ 
    static int n = 0; 

    printf("%d\n", n++); 
} 

int main(int argc, char **argv) 
{ 
    Foo *f = new Foo(); 
    f->bar(); 
    delete f; 
    f = new Foo(); 
    f->bar(); 
    delete f; 

    return 0; 
} 

い再び上でクラスをINGの 'INGのとnew' delete0からnリセット?または、nは実質的に静的なクラスメンバーです(すべてのインスタンスで同じ参照)。言い換えればクラスメンバ関数内の静的ローカルは、クラスの再割り当て時に存続しますか?

、私は

0 
0

または

0 
1

を取得する必要がありますか?

答えて

4

変数が関数内で静的であるため、変数が関数の一部でありクラスの一部ではなくても、メモリは静的なので削除されないため、0になります。

クラスのインスタンスを削除しても、そのクラスの他のインスタンスで使用できるように、関数はそのクラスのメモリに残ります。

+1

これは意味があります。したがって、静的ローカルは、実際にすべてが同じ関数インスタンスを使用しているため、すべてのクラスインスタンスで実際に同じです。 – jgottula

0

'n' は有効異なるスコープを持つ静的クラスのメンバーです。他のコンテキスト(メンバ関数、グローバルなど)の関数内の静的変数と基本的に同じです。

0

'n'は関数Foo :: barの静的変数です。作成または破棄するFooインスタンスの数にかかわらず、その関数のコピーは1つだけです。

関連する問題