全局对象构造函数未被调用

时间:2013-05-28 21:05:02

标签: c++ class object constructor

不知何故,我的全局对象是在没有各自的构造函数的情况下创建的:

static int num = 0;
class TestClass
{
public:
    int a;
    float b;
    TestClass(float f)
    {
        a = 55;
        b = f;
        ++num;
    }
};
TestClass test(32);

int main(int argc,char *argv[])
{
    std::cout<<"Int: "<<test.a<<std::endl;
    std::cout<<"Float: "<<test.b<<std::endl;
    std::cout<<"Constructor has been called "<<num<<" times"<<std::endl;
    while(true);
    return 0;
}

输出结果为:

Int: 0
Float: 0
Constructor has been called 0 times

我之前在不同的项目中使用了这样的构造函数,从未遇到过像这样的问题。 我已经尝试了无参数构造函数并使测试变量静态,没有任何不同的效果。 谁能告诉我这里发生了什么?

我正在使用visual studio 2010,以防万一。

2 个答案:

答案 0 :(得分:2)

我不完全确定,但这可能会回答您的问题:http://www.nsnam.org/docs/linker-problems.doc

已修改以添加更多信息

该文档指出了在不同编译单元中使用全局构造函数时可能出现的问题。例如,如果在某个动态链接库中全局定义对象,则从该库访问方法时可能不会调用其对象构造函数。

要使用原始问题中的示例:类TestClass和全局对象test可能位于TestLibrary.dll,而main()函数位于某个可执行文件中。根据加载TestLibrary.dll的方式和从可执行文件访问test对象的方式,它的构造函数可能永远不会被调用,因为库从未被“通知”它刚被加载(或者以不同的方式放置它) :从未调用过全局初始化函数。)

答案 1 :(得分:0)

如果将链接到可执行文件的项目编译为可执行文件,Visual Studio将链接一切正常,但不会调用Global-Constructor。