静态对象如何在编译时初始化?

时间:2011-08-10 15:01:57

标签: c++

class Bird {
public:
   Bird() {
     .....
     .....
    }    
};

void fun() {
    static Bird obj;
}

当编译器编译语句静态Bird obj 它做2件事。首先是对象obj的内存分配。其次是通过调用构造函数初始化obj。我的问题是初始化部分是否在编译时发生,构造函数中的所有语句将如何在编译时执行

4 个答案:

答案 0 :(得分:3)

  

当编译器编译语句时静态Bird obj它做了两件事。   首先是对象obj的内存分配。第二是初始化   obj通过调用构造函数。

没有。内存已在编译时分配(在程序执行之前)。只是在执行触及static Bird obj;语句时发生初始化。这称为延迟初始化

另请注意,如果Bird()构造函数抛出异常,则初始化将不会完成。因此,当fun()被调用时,obj再次尝试初始化。它会在obj成功初始化之前发生。之后,该行将不再执行。

答案 1 :(得分:2)

在编译时,编译器会在特殊的静态对象区域中留出一块内存,该区域是程序空间的一部分。那段记忆将是未初始化的。

在函数内部,编译器将放置一个不可见的“if”语句,该语句检测到第一次执行静态对象语句。如果是第一次,将调用该对象的构造函数。

答案 2 :(得分:1)

静态初始化不会在编译时发生。它发生在运行时,但在调用main()之前。

未定义静态初始化在编译单元之间传播的顺序。因此,如果你真的需要静态变量,推荐的方法是将所有这些变量放在一个static_constructors.cpp上,作为额外的好处,它们将更容易找到

答案 3 :(得分:0)

在这种情况下,static具有不同的含义。这意味着obj只会被初始化一次,第一次调用fun()obj将在fun()的调用之间重新生效。

将其视为全局变量,但只有函数fun()才能看到它:P