c++ 为什么静态全局变量初始化为零,而类中的静态成员变量没有初始化?

zxlwwiss  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(193)

static int counter // will initalized to 0
但如果我在类内部创建变量,它就不会被初始化,我必须在类外部初始化它

class Test {
static int counter;  // not initialized
};
...
Test::counter = 0;

我知道static变量是存放在BSS内存段中并默认初始化为0的,那么为什么它在我制作static类的时候没有初始化呢?

col17t5w

col17t5w1#

为什么静态全局变量初始化为零,而类中的静态成员变量没有初始化?
因为类内 * 非内联静态数据成员 * 的*声明*不是定义
这可以从静态数据成员文档中看到:
static保留字只能与类别定义内的静态成员宣告一起使用,而不能与该静态成员的定义一起使用。类别主体内的宣告不是定义,而且可能会将成员宣告为不完整的型别(void除外),包括宣告成员的型别:
此外,类外定义Test::counter = 0;不正确。它应改为int Test::counter = 0;

btxsgosb

btxsgosb2#

这个问题基于一个错误的前提。静态成员变量受零初始化的影响。下面的代码将执行counter的预期零初始化。

class Test {
static int counter;  // declaration, not defined yet
};

int Test::counter;   // definition with zero-initialization

需要的不是初始化,而是定义。没有定义,编译器就没有地方执行初始化,无论是零还是其他。
另请参阅Undefined reference to a static memberDefining static members in C++以取得更多背景信息。

相关问题