我知道静态变量是在编译时初始化的,但静态对象呢?
e.g。如果我有以下代码:
class A {
A();
};
A::A(){
std::cout << "Constructing A" << std::endl;
}
int main(){
std::cout << "Hello World!" << std::endl;
static A A_obj;
std::cout << "Goodbye cruel world" << std::endl;
return 0;
}
我应该期望输出为:
Hello World!
Constructing A
Goodbye cruel world
或
Constructing A
Hello World!
Goodbye cruel world
答案 0 :(得分:8)
&#34;我知道静态变量在编译时初始化&#34;
不正确。函数范围内的static
变量在第一次遇到时严格初始化。并且会在main
的结束后被破坏。
您将按此顺序获得输出:
Hello World!
Constructing A
Goodbye cruel world
答案 1 :(得分:3)
根据cppreference:
在块作用域中使用指定符静态声明的变量具有静态存储持续时间,但在控件第一次通过其声明时初始化(除非它们的初始化为零或常量初始化,可以执行在首次输入块之前)。在所有进一步的调用中,将跳过声明。
意味着只要为类看到声明,就会调用构造函数。此外:
块程范围静态变量的析构函数在程序退出时调用,但前提是初始化成功完成。
由于程序退出位于函数main()
的末尾,一旦程序到达main()
的末尾,将调用类的析构函数。
因此,您应该期待该程序的第一个输出。
答案 2 :(得分:1)
我知道静态变量是在编译时初始化的,但静态对象呢?
这是一个错误的理解。
如果可能的话,可以在编译时评估任何变量static
与否。有些需要在编译时进行评估。有些在编译时无法进行评估,因此必须在运行时进行初始化。再一次,这不取决于变量是否为static
。
来到你的代码,你应该期待第一个输出块。
初始化A_obj
的代码在执行上一行后执行。