【问题标题】:c++: Static variable defined in constructorc ++:在构造函数中定义的静态变量
【发布时间】:2021-07-06 22:12:35
【问题描述】:

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

类:

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),所以这种“类内”初始化让我感到困惑,因为这是真正发生的事情。

静态变量是否仅在第一次运行时定义,然后被忽略?这是任何函数和成员函数的一般行为吗?

【问题讨论】:

  • 那个“谷歌热门”并不能准确解释我的困惑。我特别要求进行课堂初始化。是的,事实证明这与全局范围函数中的行为相同,但这正是我想要澄清的。

标签: c++ class constructor static-variables


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 2013-12-28
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多