static int counter // will initalized to 0但如果我在类内部创建变量,它就不会被初始化,我必须在类外部初始化它
static int counter // will initalized to 0
class Test { static int counter; // not initialized }; ... Test::counter = 0;
我知道static变量是存放在BSS内存段中并默认初始化为0的,那么为什么它在我制作static类的时候没有初始化呢?
col17t5w1#
为什么静态全局变量初始化为零,而类中的静态成员变量没有初始化?因为类内 * 非内联静态数据成员 * 的*声明*不是定义。这可以从静态数据成员文档中看到:static保留字只能与类别定义内的静态成员宣告一起使用,而不能与该静态成员的定义一起使用。类别主体内的宣告不是定义,而且可能会将成员宣告为不完整的型别(void除外),包括宣告成员的型别:此外,类外定义Test::counter = 0;不正确。它应改为int Test::counter = 0;
Test::counter = 0;
int Test::counter = 0;
btxsgosb2#
这个问题基于一个错误的前提。静态成员变量受零初始化的影响。下面的代码将执行counter的预期零初始化。
counter
class Test { static int counter; // declaration, not defined yet }; int Test::counter; // definition with zero-initialization
需要的不是初始化,而是定义。没有定义,编译器就没有地方执行初始化,无论是零还是其他。另请参阅Undefined reference to a static member和Defining static members in C++以取得更多背景信息。
2条答案
按热度按时间col17t5w1#
为什么静态全局变量初始化为零,而类中的静态成员变量没有初始化?
因为类内 * 非内联静态数据成员 * 的*声明*不是定义。
这可以从静态数据成员文档中看到:
static保留字只能与类别定义内的静态成员宣告一起使用,而不能与该静态成员的定义一起使用。类别主体内的宣告不是定义,而且可能会将成员宣告为不完整的型别(void除外),包括宣告成员的型别:
此外,类外定义
Test::counter = 0;
不正确。它应改为int Test::counter = 0;
btxsgosb2#
这个问题基于一个错误的前提。静态成员变量受零初始化的影响。下面的代码将执行
counter
的预期零初始化。需要的不是初始化,而是定义。没有定义,编译器就没有地方执行初始化,无论是零还是其他。
另请参阅Undefined reference to a static member和Defining static members in C++以取得更多背景信息。