2013-09-28 37 views
2

通过这里的文件去http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2011/n3242.pdf初始化静态成员数组为零

“具有静态存储的持续时间(3.7.1)或线程存储 持续时间(3.7.2)的变量应零初始化(8.5)任何其他 初始化发生”

如果我拥有的一切之前,即类的声明和主()在一个单一的文件(必须的),我应该能够省略初始化。 但是,如果我省略,在构建过程中会出现“未定义引用”错误。

#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

回答

8

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

你可以不可以省略整条线,因为否则你只是声明数组,但你永远不会在任何地方定义 - 这是什么导致你的问题。

+0

对于初始化更正确的二维数组? 'int foo :: array [2] [2] = {{0}};'或'int foo :: array [2] [2] = {0};'或'int foo :: array [2] [ 2] = {};' – ontherocks

+0

@ontherocks第一个是无效的AFAICT,后两个是相同的,所以与最后两个版本不是更“正确”的版本。 –

0

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

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