class Bird {
public:
Bird() {
.....
.....
}
};
void fun() {
static Bird obj;
}
当编译器编译语句静态Bird obj 它做2件事。首先是对象obj的内存分配。其次是通过调用构造函数初始化obj。我的问题是初始化部分是否在编译时发生,构造函数中的所有语句将如何在编译时执行
答案 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