静态对象初始值设定项C++

static object initializer C++

本文关键字:C++ 对象 静态      更新时间:2023-10-16

可能的重复项:
文件范围和静态浮点数
什么是静态变量?

这是一本书中的代码。

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 声明为静态,会发生什么情况?

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

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

或者,更改main以在调用 f 后打印内容。然后观察到,使用 staticX 对象在main打印被销毁(静态对象一直存在到程序结束),而如果没有static,对象在main打印之前被销毁(自动对象只活到退出其范围,在这种情况下函数f)。

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

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

两者之间的区别

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 并将其初始化为零一次,然后每次调用它都会从上一个调用值递增它。

下面是一些代码来测试函数中的静态对象是什么意思:

#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 的示例,以便您可以使用它。