我是C ++的新手,我只是不明白为什么为什么我不能在类内为非常量静态成员赋值 (就像我们在Java static int x = 12;
中所做的一样)甚至以为我可以
static int x;
)static const x;
)static const int x = 12;
)注意:我的课程和我的main()函数位于同一文件中
答案 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) {
...
}