为了账号安全,请及时绑定邮箱和手机立即绑定

在C ++中定义静态成员

/ 猿问

在C ++中定义静态成员

C++
牛魔王的故事 2019-08-19 16:51:04

在C ++中定义静态成员

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

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

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

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

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

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

谢谢 !


查看完整描述

3 回答

?
慕斯王

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

来自Bjarne Stroustrup的C ++风格和技巧常见问题解答

类通常在头文件中声明,并且头文件通常包含在许多翻译单元中。但是,为避免复杂的链接器规则,C ++要求每个对象都有唯一的定义。如果C ++允许将需要作为对象存储在内存中的实体的类内定义,则该规则将被破坏。

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

[ dirkgently说它更好 ]

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

据我所知,只要你在.cpp中声明静态成员var,如果你没有另外指定,它将被零初始化:

// in some .cppint Test::j; // j = int();


查看完整回答
反对 回复 2019-08-19
?
慕侠2389804

您必须在.cpp文件中初始化静态变量,而不是在类声明中。


在类中声明静态变量时,可以在不实例化类的情况下使用它。


//Header file

class Test

{

  public:

    static int j;

};


//In cpp file


//Initialize static variables here.

int Test::j = 0;


//Constructor

Test::Test(void)

{

   //Class initialize code

}


查看完整回答
反对 回复 2019-08-19
?
慕哥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中变得更加棘手。现在可以初始化所有文字类型(而不是当前标准中的整数类型),这意味着现在可以使用声明中的初始化程序初始化所有标量类型(包括浮点数)和某些类类型。


查看完整回答
反对 回复 2019-08-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信