C++ 静态成员变量初始化c++; 当我没有初始化静态成员变量的值时,为什么编译器会给我一个错误?它不应该初始化为0吗 为什么我必须在类外初始化成员变量?(这是非法的,因为如果您这样做,并在主函数内更改此静态成员变量的值,并且创建此clas的对象,它会将静态mamber变量重新分配给旧值)而const static member变量在类内初始化是合法的(这是可能的,因为您无论如何都不能更改此静态成员变量的值)

C++ 静态成员变量初始化c++; 当我没有初始化静态成员变量的值时,为什么编译器会给我一个错误?它不应该初始化为0吗 为什么我必须在类外初始化成员变量?(这是非法的,因为如果您这样做,并在主函数内更改此静态成员变量的值,并且创建此clas的对象,它会将静态mamber变量重新分配给旧值)而const static member变量在类内初始化是合法的(这是可能的,因为您无论如何都不能更改此静态成员变量的值),c++,static,C++,Static,错误:未定义对class_name::a的引用从发布的错误中,链接器声明变量未定义,而不是未显式初始化: class A { // declaration. static int x; }; // definition (in this case without explicit initialisation). int A::x; 链接器不应发出错误,编译器也不应发出警告,只要在分配初始值之前未尝试使用静态变量。从发布的错误中,链接器声明变量未定义,而不是未显式定义g> 初

错误:未定义对class_name::a的引用从发布的错误中,链接器声明变量未定义,而不是未显式初始化:

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

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

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

从发布的错误中,链接器声明变量未定义,而不是未显式定义g> 初始化:

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

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

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

静态成员实际上不会存储在创建的任何对象中,因为它在该类的所有对象之间共享

即使您创建了该类的多个对象,或者即使您没有创建该类的对象,也应该只创建一次。因此,您必须单独执行此操作


编译器会警告所有类型的非斜体变量,而不仅仅是静态变量。如果变量没有值,通常不会很有用,因此这些警告很好。添加
=0
不是很难,是吗?

静态成员实际上不会存储在创建的任何对象中,因为它在所有对象之间共享那个班

即使您创建了该类的多个对象,或者即使您没有创建该类的对象,也应该只创建一次。因此,您必须单独执行此操作


编译器会警告所有类型的非斜体变量,而不仅仅是静态变量。如果变量没有值,通常不会很有用,因此这些警告是好的。添加
=0
不是很难,是吗?

你能发布一些代码和编译器错误吗?@hmjd:对class_name::aNote的未定义引用:这是链接器g给你的是错误,而不是编译器。这与声明一个(免费的)相同全局变量作为头文件中的
extern
,但不是在.cpp文件中实际定义它。全局变量必须具有所有编译单元都知道的一致内存位置,否则它们将看不到彼此对其值的更改。因此,它必须具有外部链接,并且只定义一次。它与
静态
不同>(本地编制单位)变量。@pmjordan:不是链接器,错误发生在编译期间。未定义的引用通常是链接器错误。如果您使用的是IDE,您可能没有意识到编译已经完成,并且正在进行链接。您可以发布一些代码和编译器错误吗?@hmjd:对class_name::aNote:的未定义引用就是链接器给出的是错误,而不是编译器。这与声明a(免费)的效果相同全局变量作为头文件中的
extern
,但不是在.cpp文件中实际定义它。全局变量必须具有所有编译单元都知道的一致内存位置,否则它们将看不到彼此对其值的更改。因此,它必须具有外部链接,并且只定义一次。它与
静态
不同>(本地编制单位)变量。@pmjordan:这不是链接器,错误发生在编译期间。未定义的引用通常是链接器错误。如果您使用的是IDE,您可能没有意识到编译已经完成,并且正在进行链接…您做得很好,然后…在上一个代码示例中,没有定义。有声明和初始化值,但没有定义。这在许多情况下都可以,因为静态积分常数有特殊规则,但如果(odr-)为使用它。@DavidRodríguez dribeas,现在刚刚删除了它。我在声明时认为,如果一个变量被赋予了一个初始值,
extern int x=1;
,这就使得它成为了一个定义?嗯。
a::x
默认值为
0
,就像任何其他类静态
int
变量一样。@hmjd没有这样的泛型我的规则是这样的。对于
extern int x
如果直接初始化它,它就成为一个定义。但是对于
static
的类内初始化,它就不会成为一个定义。@johanneschaub litb我想我误解了声明、定义和初始化变量之间的区别。你能告诉我m?…您做得很好,然后…在上一个代码示例中,没有定义。有声明和初始化值,但没有定义。在许多情况下,这可能很好,因为静态整数常量有特殊的规则,但是如果您(odr-),您仍然需要定义常量使用它。@DavidRodríguez dribeas,现在刚刚删除了它。我在声明时认为,如果一个变量被赋予了一个初始值,
extern int x=1;
,这就使得它成为了一个定义?嗯。
a::x
默认值为
0
,就像任何其他类静态
int
变量一样。@hmjd没有这样的泛型l规则是这样的。对于
extern int x
,如果您直接初始化它,它将成为一个定义。但是对于
static
的类内初始化,它不会成为一个定义。@Johan