2012-03-16 169 views
0
  1. 为什么编译器给我一个错误,当我不初始化一个值到静态成员变量?不应该初始化为0吗?
  2. 为什么我必须在类之外初始化成员变量? (这是非法的,因为如果你这样做,并且改变这个静态成员变量在main函数内部的值,并且你创建了这个clas的一个对象,它将重新分配静态mamber变量到旧的值),而const静态成员变量是合法的在类内初始化(这是可能的,因为你无法改变这个静态成员变量的值)?

错误:未定义参考CLASS_NAME ::一个静态成员变量初始化C++

+3

你可以发布一些代码和编译器错误吗? – hmjd 2012-03-16 21:28:13

+0

@hmjd:undefined引用class_name :: a – AlexDan 2012-03-16 21:31:43

+1

注意:这是*链接器*给你的错误,而不是编译器。这与在头文件中声明一个(自由)全局变量为'extern'相同的效果,但实际上并没有在.cpp文件中定义它。全局变量必须具有一致的内存位置,所有编译单元都知道它们,否则它们将不会看到对方对其值的更改。因此,它必须有外部联系,并且只能定义一次。它*不像*静态(编译单元本地)变量。 – pmdj 2012-03-16 21:33:37

回答

5

从错误中发布,该接头用,说明该变量尚未定义,并不在于它一直没有明确初始化

class A 
{ 
    // declaration. 
    static int x; 
}; 

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

链接器不应发出错误和编译器应该不会发出警告,只要不尝试使用static变量已分配的前 初始值。

+0

...你做得很好,然后....在最后一个代码示例中,没有定义。有一个*声明*和初始化值,但没有定义。在很多情况下,这可以很好,因为静态积分常量有特殊的规则,但是如果你使用*(odr-),你仍然需要**定义常量。 – 2012-03-16 21:48:42

+0

@DavidRodríguez-dribeas,刚刚删除,现在。我在声明中想过,如果一个变量被分配了一个初始值,例如'extern int x = 1;',这使得它成为一个定义? – hmjd 2012-03-16 21:51:16

+0

呵呵。默认情况下,“A :: x”的值为“0”,就像任何其他类静态的'int'变量一样。 – 2012-03-16 21:53:58

0

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

只应创建一次,即使您创建了该类的许多对象。或者即使您创建该类的对象也是。因此你必须单独做。

编译器对各种未经初始化的变量(不仅是静态变量)发出警告。有一个没有价值的变量通常不是很有用,所以这些警告是好的。添加一个= 0不是太难,是吗?