为什么需要定义类的静态变量,而不需要定义类的其他成员?



当我们有一个带有静态成员变量的类时,为什么我们需要定义它?

为什么我们不能直接使用它?

我想看看如果我不定义静态变量是否会分配内存空间,所以我写了这段代码,看起来内存确实是为变量分配的。

#include <iostream>
using namespace std;
class A
{
public:
int a;
static int b;
};
// int A::b = 1;
int main() 
{
cout<<sizeof(A::b);
return 0;
}

输出:

4

现在,我定义了变量并初始化了它(没有注释int A::b = 1;)行)并运行相同的代码,即使这次输出也是相同的。

那么,定义它的目的是什么呢?

如果变量是odr使用的,则需要定义,而sizeof(A::b)不需要。

在整个程序(包括任何标准库和用户定义库)中,必须出现且只能出现一个odr使用的(见下文)的非内联函数或变量的定义。编译器不需要诊断这种冲突,但是违反它的程序的行为是未定义的。

例如,如果你取了变量的地址,那么它是不可用的,必须定义它。

cout << &A::b;

对于静态数据成员,您必须在实现中为其分配内存,您现在所做的并不分配内存,但您只是获得int的大小。在c++ 17中,你可以声明静态变量内联,对于int,它的默认值是零,但你可以设置任何你想要的值。这样的:

static inline int b=4;

最新更新