3

重複の可能性:
ファイルスコープと静的フロート
静的変数とは?

これは本のコードです。

class X
{
   int i;
public:
   X(int ii = 0) : i(ii) {cout<<i<<endl;} // Default
   ~X() { cout << "X::~X()" << endl; }
};
void f()
{
  static X x1(47);
  static X x2; // Default constructor required
}

int main()
{
  f();

   return 0;
}

私の質問は、なぜ関数 f() のようにオブジェクトを static として宣言したいのですか? x1 と x2 を static として宣言しないとどうなりますか?

4

4 に答える 4

1

関数 f() が最初にヒットすると、静的が初期化されます (遅延読み込み)。それらが静的であると宣言されていない場合、それらはローカル変数になり、関数 f() を呼び出すたびに再作成されます。

f() へのすべての呼び出しは、同じ x1 と x2 を使用することになります。

于 2012-10-13T12:26:20.927 に答える
1

このコードでは、プログラムの観察可能な動作に違いはありません。

1 回だけではなく 2 回main呼び出すように変更し、違いを観察します。電話。fstaticXfstatic

mainまたは、を呼び出した後に何かを印刷するように変更しますf。次に、 を使用するとstatic、出力Xにオブジェクトが破棄される(静的オブジェクトはプログラムの最後まで存続する) のに対し、使用しない場合は、出力前にオブジェクトが破棄される(自動オブジェクトは、そのスコープ (この場合は関数) を終了するまでのみ存続) を観察します。 mainstatic mainf

于 2012-10-13T12:51:23.853 に答える
0

の違い

int f()
{
      int i = 0;
      ++i;
      return i;
}

int f2()
{
     static int i = 0;
     ++i;
     return i;    
}

int main()
{
      for (int i = 0; i < 10; ++i) { cout << f1() << ' ' << f2() << endl; }
}

f1 は常に新しいローカル変数 i を作成し、それをゼロに設定してからインクリメントしますが、f2 はローカル変数 i を作成し、一度staticゼロに初期化してから、呼び出しごとに前の呼び出し値からインクリメントします。

于 2012-10-13T12:28:36.043 に答える
0

関数内の静的オブジェクトの意味をテストするコードを次に示します。

#include <iostream>

using namespace std;
class A {
  public:
   void increase() {
     static int b = 0;
     b++;
     cout << "A::increase: " << b << endl;
   }
};
int main() {
        A a;
        a.increase();
        a.increase();
        a.increase();
        return 0;
}

出力は次のとおりです。

A::increase: 1
A::increase: 2
A::increase: 3

関数呼び出し間で b の値が保持されることに注意してください。ideoneの例を次に示します。これで遊ぶことができます。

于 2012-10-13T12:29:15.637 に答える