2

在此处查看文档http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2011/n3242.pdf

“具有静态存储持续时间 (3.7.1) 或线程存储持续时间 (3.7.2) 的变量应在任何其他初始化发生之前进行零初始化 (8.5)”</p>

如果我在一个文件中拥有所有东西,即类声明和 main()(必须),我应该能够省略初始化。但是,如果我省略,我会在构建过程中收到“未定义的引用”错误。

#include <iostream>
using namespace std;

class foo
{
    public:
        static int array[2];
};

int foo::array[2] = {0}; //I should be able to omit this line

int main()
{
    cout << "foo::array[0] = " << foo::array[0] << endl;
    return 0;
}

PS:没有 C++11

4

2 回答 2

8

我认为你误读了标准。您可以简单地删除该= {0}部分,因为编译器会自动用零初始化它。

您不能省略整行,否则您只需声明数组,但您从未在任何地方定义它 - 这就是导致您出现问题的原因。

于 2013-09-28T17:35:45.993 回答
0

对于类的静态数据成员,必须在实现文件中强制提供定义,因为,

无论创建多少对象,静态数据都有一个存储区,该存储区必须在一个地方定义。编译器不会为您分配存储空间。如果声明了静态数据成员但未定义,链接器将报告错误。

于 2013-09-29T15:01:37.943 回答