c ++:为什么我不能在类的“内部”给非常量静态成员赋值?

时间:2019-01-23 09:40:16

标签: c++ static

我是C ++的新手,我只是不明白为什么为什么我不能在类内为非常量静态成员赋值 (就像我们在Java static int x = 12;中所做的一样)甚至以为我可以

  • 声明一个非常量静态成员(static int x;
  • 声明一个静态const成员(static const x;
  • 分配静态const成员(static const int x = 12;

注意:我的课程和我的main()函数位于同一文件中

2 个答案:

答案 0 :(得分:2)

一般

与其他所有内容一样,类内的static变量默认情况下只是一个声明。然后,C ++要求您为每个需要一个实体的实体提供单个定义,这就是“一个定义规则”。定义是初始化程序(不是赋值,而是构造)的位置,因为也应该只有一个。通常将其放置在.cpp文件中,以免被#include意外复制。

不变的情况

当静态成员是常量整数或枚举并使用编译时表达式进行初始化时,可以将初始化程序放置在声明中,并跳过定义。这是旧规则结合在一起的结果,在今天的IMO中并没有那么有趣。

正确的内联初始化

由于C ++ 17引入了inline变量,因此您可以将它们用作static成员。这些规则与inline函数大致相同,并且非常明智:您可以提供inline实体的多个定义,您有责任确保它们严格相同,并且实现负责用其初始值设定项将它们折叠为一个定义。因此,您要寻找的是这样写的:

struct Foo {
    static inline int bar = 42;
    //     ^^^^^^
};

答案 1 :(得分:-1)

您必须在类定义之外初始化静态成员,如下例所示:

class Box {
   public:
      static int x;               
};

// Initialize static member of class Box outside the class definition
int Box::x = 12;

int main(void) {
...
}