c ++:构造函数中定义的静态变量

c++: Static variable defined in constructor

我很好奇这里“幕后”到底发生了什么。我正在创建一个 Class 并在调用构造函数时自动分配一个 ID 变量,具体取决于过去创建的实例数量。

Class:

class MyClass{
int ID;
public:
  MyClass(){
    static int id{1}; // Seems to be redefined every time the constructor is called.
    ID = id++;
  }
};

主要:

int main()
{
  MyClass a; // ID = 1
  MyClass b; // ID = 2
  MyClass c; // ID = 3
  return 0;
}

我只习惯使用在全局范围内初始化的静态成员变量(即MyClass::staticVariable = 1),所以这个“in-class”初始化让我很困惑,因为什么真的发生了。

静态变量是不是只在行运行的第一次定义,然后就忽略了?这是任何函数和成员函数的一般行为吗?

id 是一个 static local variable。在本地使用 static 关键字 变量将其持续时间从 automatic 持续时间更改为 static 持续时间。

根据 cpp ref,初始化是在控件第一次通过它们的声明时完成的。在所有进一步的调用中,声明被跳过。

Static local variables and lifetime-of-a-static-variable是一些有趣的详细文章。

就所有意图和目的而言,行为与在全局范围内初始化的静态成员变量相同,您似乎已经掌握了这一点。我能看到两者之间的唯一区别是范围,在构造函数中声明的静态变量仅在构造函数范围内可用,而声明为 class 成员的静态变量当然在 class范围,遵循访问规则,作为所有其他人。