11

私がこのプログラムを持っているとしましょう:

class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;
}

(もちろん、この例は、明らかに「counter」をプライベート属性として宣言するので意味がありませんが、問題を説明するためだけのものです)。

このような状況でC++がどのように動作するかを知りたいのですが、bar()メソッドの変数「counter」はすべてのインスタンスで同じですか?

4

5 に答える 5

10

はい、実行可能ファイル内counterのタイプのオブジェクトのすべてのインスタンス間で共有さFooれます。シングルスレッド環境にいる限り、共有カウンターとして期待どおりに機能します。

マルチスレッド環境では、デバッグするための興味深い競合状態が発生します:)。

于 2010-01-29T18:18:50.190 に答える
2

「すべてのインスタンスで同じである」とは、各クラスインスタンス間で共有されるこの変数のインスタンスが1つあることを意味します。そうすれば、その通りです。クラスのすべてのインスタンスは、同じ変数インスタンスを使用します。

ただし、クラス変数では、多くの場合、マルチスレッドなどを考慮に入れる必要があることに注意してください。これはまったく別のトピックです。

于 2010-01-29T18:13:09.813 に答える
1

BjarneStroustrupによるC++プログラミング言語(第2版)、200ページから:

[plain]関数(§7.1.2)とクラス(§10.2.4)の内部を除いて静的を使用しないでください。

于 2010-01-29T18:21:34.243 に答える
1

あなたの例は、コンパイルしてテストできるものから数行離れたところにあります。

#include <iostream>
using namespace std;
class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;

    for (int i=0; i < 10; i++)
      cout<<i<<". "<<a.bar()<<" / "<<b.bar()<<endl;
}

出力は次のようになります。

0. 1 / 0
1. 3 / 2
2. 5 / 4
3. 7 / 6
4. 9 / 8
5. 11 / 10
6. 13 / 12
7. 15 / 14
8. 17 / 16
9. 19 / 18

そうです、カウンターはすべてのインスタンスで共有されます。

于 2010-01-29T18:56:40.210 に答える
0

あなたはただ2つのことを把握する必要があります:

  1. 静的変数は、実行中のプログラムの静的領域(グローバル変数と同じ)に格納されます。
  2. スコープは括弧の一般的な規則によって制限されます。さらに、静的変数には内部リンクがあります。
于 2010-01-29T18:22:01.840 に答える