猿问
下载APP

在C ++中定义静态成员

在C ++中定义静态成员

我试图定义一个这样的公共静态变量:

public :
         static int j=0;        //or any other value too

我在这一行得到了一个编译错误:ISO C ++禁止非const静态成员`j'的类内初始化。

  1. 为什么在C ++中不允许这样做?

  2. 为什么允许const成员初始化?

  3. 这是否意味着C ++中的静态变量没有像C一样用0初始化?

谢谢 !


牛魔王的故事
浏览 54回答 3
3回答

慕斯王

(1.)为什么C ++中不允许这样做?来自Bjarne Stroustrup的C ++风格和技巧常见问题解答:类通常在头文件中声明,并且头文件通常包含在许多翻译单元中。但是,为避免复杂的链接器规则,C ++要求每个对象都有唯一的定义。如果C ++允许将需要作为对象存储在内存中的实体的类内定义,则该规则将被破坏。(2.)为什么允许const成员初始化?[ dirkgently说它更好 ](3.)这是否意味着C ++中的静态变量没有像C一样用0初始化?据我所知,只要你在.cpp中声明静态成员var,如果你没有另外指定,它将被零初始化:// in some .cppint Test::j; // j = int();

慕侠2389804

您必须在.cpp文件中初始化静态变量,而不是在类声明中。在类中声明静态变量时,可以在不实例化类的情况下使用它。//Header fileclass Test{  public:    static int j;};//In cpp file//Initialize static variables here.int Test::j = 0;//ConstructorTest::Test(void){   //Class initialize code}

慕哥9229398

为什么在C ++中不允许这样做?除非您定义它,否则该变量不会成为l值。为什么允许const成员初始化?即使在这种情况下,如果要获取变量的地址,也需要定义。9.4.2静态数据成员2在类定义中声明静态数据成员不是定义,除了cv-qualified void之外,它可能是不完整的类型。静态数据成员的定义应出现在包含成员类定义的命名空间范围内。在命名空间作用域的定义中,静态数据成员的名称应使用::运算符通过其类名限定。静态数据成员定义中的初始化表达式在其类的范围内此外,这主要是一个使用工件,所以你可以写:class S {       static const int size = 42;       float array[ size ];};这是否意味着C ++中的静态变量没有像C一样用0初始化?不,是他们:3.6.2非局部变量的初始化在进行任何其他初始化之前,具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的变量应为零初始化(8.5)。虽然事情在C ++ 0x中变得更加棘手。现在可以初始化所有文字类型(而不是当前标准中的整数类型),这意味着现在可以使用声明中的初始化程序初始化所有标量类型(包括浮点数)和某些类类型。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答