静态成员变量初始化 C++

Posted

技术标签:

【中文标题】静态成员变量初始化 C++【英文标题】:static member variables initialization c++ 【发布时间】:2012-03-16 21:25:00 【问题描述】:
    为什么当我没有将值初始化为静态成员变量时编译器会给我一个错误?不应该初始化为0吗? 为什么我必须在类外初始化成员变量? (这是非法的,因为如果这样做,并在主函数中更改此静态成员变量的值并创建此 clas 的对象,它会将静态 mamber 变量重新分配给旧值)而 const 静态成员在类中初始化变量是合法的(这是可能的,因为无论如何您都无法更改此静态成员变量的值)?

错误:未定义对 class_name::a 的引用

【问题讨论】:

你能发布一些代码和编译器错误吗? @hmjd : 未定义对 class_name::a 的引用 注意:这是 linker 给你的错误,而不是编译器。这与在标头中将(免费)全局变量声明为 extern 但实际上并未在 .cpp 文件中定义它的效果相同。全局变量必须具有所有编译单元都知道的一致内存位置,否则它们将看不到彼此对其值的更改。因此,它必须具有外部链接并且只定义一次。它类似于static(编译单元本地)变量。 @pmjordan : 不是链接器,错误是在编译期间。 未定义的引用 通常是链接器错误。如果您使用的是 IDE,您可能没有意识到编译已经完成并且正在进入链接。 【参考方案1】:

从发布的错误中,链接器说明该变量尚未定义,而不是它尚未明确初始化

class A

    // declaration.
    static int x;
;

// definition (in this case without explicit initialisation).
int A::x;

链接器不应发出错误,编译器不应发出警告,只要在分配初始值之前未尝试使用 static 变量。

【讨论】:

...你做得很好然后....在最后一个代码示例中,没有定义。有声明和初始化值,但没有定义。这在很多情况下都可以,因为静态整数常量有特殊的规则,但是如果你(odr-)使用它,你仍然需要定义这个常量。 @DavidRodríguez-dribeas,暂时将其删除。我在声明时认为是否为变量分配了初始值,例如extern int x = 1;,这使它成为一个定义? 嗯。 A::x 默认值为 0,就像任何其他类静态 int 变量一样。 @hmjd 没有这样的一般规则。对于extern int x,如果您直接对其进行初始化,则使其成为定义。但是对于static 的类内初始化,它不会成为定义。 @JohannesSchaub-litb 我想我误解了声明、定义和初始化变量之间的区别。你能告诉我它们之间的区别吗?【参考方案2】:

静态成员并不真正存储在任何创建的对象中,因为它在该类的所有对象之间共享。

它应该只创建一次,即使您创建了该类的许多对象。或者即使你创建了类的 no 个对象。因此,您必须单独进行。

编译器会警告各种未初始化的变量,而不仅仅是静态变量。没有值的变量通常不是很有用,所以这些警告是好的。添加= 0 并不难,是吗?

【讨论】:

以上是关于静态成员变量初始化 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++静态成员变量初始化

C++静态成员变量初始化

C++静态成员变量及其初始化

c++中静态成员变量和静态成员函数(笔试经历)

总结C++静态成员变量的特性总结及测试用例

C++中静态成员变量(不支持在类定义中初始化不是常量的静态数据成员)