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

4

4 回答 4

1

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

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

于 2012-10-13T12:26:20.927 回答
1

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

更改main为调用f两次而不是仅调用一次,并观察差异——如果变量是static,则只创建一对X对象(第一次f被调用),而如果不是,static则每次创建一对对象称呼。

或者,main在调用f. 然后观察 with 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 将创建一个static局部变量 i 并将其初始化为零一次,然后每次调用它都会从先前的调用值递增它。

于 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 回答