4

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

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,以防万一。

4

2 回答 2

3

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

编辑添加更多信息

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

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

于 2013-05-28T21:19:14.627 回答
0

如果将链接到可执行文件的项目编译为可执行文件,Visual Studio 将链接一切正常,但不会调用全局构造函数。

于 2015-03-11T09:05:55.357 回答