静态对象的构造函数未被调用

时间:2015-04-06 04:07:41

标签: c++

我有一个头文件,它定义了两个对象:

// header.h
static A object1("param1", "param2");
static A object2("param1", "param2");

这就是A的样子:

class A {
    public:
    int random;
    A(char* p1, char* p2){
        printf("Called constructor for %s | %s\n", p1, p2);
    }
};

但是,构造函数永远不会被调用。我这样做:

#include "header.h"

int main(){
    // to prevent optimization issues
    object1.random = rand();
    if (object1.random != 3) { printf("\n"); }
    return 0;
}

我从未在控制台上看到消息,它仍然是空的。

我已经阅读了static initialization order fiasco,但我认为这不是问题,因为这些对象都不依赖于另一个,所以订单并不是真的物质...

我在Windows 7 x64上使用MSVC ++ 2013

1 个答案:

答案 0 :(得分:0)

When are static C++ class members initialized?包含有关此主题的绝佳答案。

简而言之,有3个保证(引用上述问题中的原始Tadeusz Kopec答案):

  1. 在同一翻译单元中定义的对象(通常表示.cpp文件)按其定义的顺序进行初始化
  2. 翻译单元中静态对象的初始化将在使用此翻译单元中的任何对象或功能之前完成。
  3. 它们将在输入main之前初始化。
  4. 如果在特定情况下静态变量object1object2未初始化,则可能与编译器优化无关,省略了未使用变量的初始化。您可以通过在main中添加这些变量的用法来轻松验证这一点,并观察这些变量是否已初始化以及何时初始化。