Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将静态成员数组初始化为零_C++_Arrays_Static - Fatal编程技术网

C++ 将静态成员数组初始化为零

C++ 将静态成员数组初始化为零,c++,arrays,static,C++,Arrays,Static,看这里的文件 “具有静态存储持续时间(3.7.1)或线程存储的变量 持续时间(3.7.2)应在任何其他时间之前初始化为零(8.5) 初始化发生“ 如果我在一个文件中有所有的东西,比如类声明和main(),我应该能够省略初始化。 但是,如果我省略了,在构建过程中会出现“未定义引用”错误 #include <iostream> using namespace std; class foo { public: static int array[2]; }; in

看这里的文件

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

如果我在一个文件中有所有的东西,比如类声明和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;
}
#包括
使用名称空间std;
福班
{
公众:
静态整数数组[2];
};
intfoo::数组[2]={0}//我可以省略这一行
int main()
{

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


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

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


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

对于2D数组,哪个初始化更正确?
int foo::array[2][2] ={0};
int-foo::array[2][2]={0};
int-foo::array[2][2]={};
@ontherock第一个是无效的AFAICT,后两个是等效的,因此与后两个版本wrt没有“更正确”的版本。