static object initializer C ++

时间:2012-10-13 12:23:14

标签: c++

  

可能重复:
  file scope and static floats
  What are static variables?

这是一本书中的代码。

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()中的静态?如果我没有将x1和x2声明为静态会发生什么?

4 个答案:

答案 0 :(得分:1)

第一次触发函数f()时,将初始化静态(延迟加载)。如果它们没有被声明为静态,那么它们将是局部变量并在每次调用函数f()时重新创建。

对f()的所有调用都将导致使用相同的x1和x2。

答案 1 :(得分:1)

对于此代码,它对程序的可观察行为没有任何影响。

更改main两次调用f而不是仅调用一次,并观察差异 - 如果变量为static则只有一对X对象已创建(第一次调用f),而如果它们不是static,则每次调用都会创建一对对象。

或者,在调用main后更改f以打印内容。然后使用static观察X对象在 main打印后被破坏(静态对象一直存在直到程序结束),而没有{{ 1}}在 static打印之前,对象被销毁(自动对象仅在其范围退出之前一直存在,在本例中为函数main)。

答案 2 :(得分: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将创建一个static局部变量i并将其初始化为零一次并且然后每次调用它都会从之前的调用值中增加它。

答案 3 :(得分: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的值? Here是关于ideone的示例,以便您可以使用它。