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范围,遵循访问规则,作为所有其他人。
我很好奇这里“幕后”到底发生了什么。我正在创建一个 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范围,遵循访问规则,作为所有其他人。