什么时候构造函数调用静态对象

时间:2018-02-09 17:25:07

标签: c++

我知道静态变量是在编译时初始化的,但静态对象呢?

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

3 个答案:

答案 0 :(得分:8)

  

&#34;我知道静态变量在编译时初始化&#34;

不正确。函数范围内的static变量在第一次遇到时严格初始化。并且会在main的结束后被破坏。

您将按此顺序获得输出:

Hello World!
Constructing A
Goodbye cruel world

答案 1 :(得分:3)

根据cppreference

  

在块作用域中使用指定符静态声明的变量具有静态存储持续时间,但在控件第一次通过其声明时初始化(除非它们的初始化为零或常量初始化,可以执行在首次输入块之前)。在所有进一步的调用中,将跳过声明。

意味着只要为类看到声明,就会调用构造函数。此外:

  

块程范围静态变量的析构函数在程序退出时调用,但前提是初始化成功完成。

由于程序退出位于函数main()的末尾,一旦程序到达main()的末尾,将调用类的析构函数。

因此,您应该期待该程序的第一个输出。

答案 2 :(得分:1)

  

我知道静态变量是在编译时初始化的,但静态对象呢?

这是一个错误的理解。

如果可能的话,可以在编译时评估任何变量static与否。有些需要在编译时进行评估。有些在编译时无法进行评估,因此必须在运行时进行初始化。再一次,这不取决于变量是否为static

来到你的代码,你应该期待第一个输出块。

初始化A_obj的代码在执行上一行后执行。