为什么需要在类外部初始化非常量静态变量?

时间:2017-12-19 08:06:19

标签: c++ static

我知道非常量静态变量需要在类定义之外进行初始化,但这是否有原因?

class A {
    static int x = 0 // compile error;
    static int y;
};

int A::y = 0; // fine

4 个答案:

答案 0 :(得分:17)

const限定符存在时,静态变量可以被视为常量表达式。在类定义中初始化它会产生这种效果。它只是一些不变的价值,甚至可能不需要任何存储空间。

但在另一种情况下,它不是一个常数表达式。它肯定需要存储。正如@Bathsheba指出的那样,它只需要在一个翻译单元中定义(前C ++ 17)。一般来说,包含初始值设定项的声明也是一个定义。所以它在宣布时无法初始化。

从C ++ 17开始,该变量可以是内联变量。因此,该定义实际上可以包含在类声明

class A {
  static inline int x = 0;
};

编译器会将所有这些声明理清为相同的存储空间。

答案 1 :(得分:15)

基本上它是因为 int inc = 15; DateTime startTime = DateTime.Today;//new DateTime(2013,9,6,18,40,0,DateTimeKind.Local);//DateTime.Today.AddHours(10).AddMinutes(50); DateTime endTime = DateTime.Today.AddHours(18).AddMinutes(35);//DateTime.Now; List<DateTime> timeList = new List<DateTime>(); //while (startTime < DateTime.Now.AddMinutes(inc)) for (DateTime i = startTime; i < endTime; i = i.AddMinutes(inc)) { Console.WriteLine(i.ToString("HH:mm:sss")); } 的存在与创建的x实例的数量无关。

因此需要在某处定义A的存储空间 - 您不能依赖x的实例来执行此操作,而这是

A

只有一个翻译单元。

答案 2 :(得分:3)

经过一项小规模的研究,发现了这个(来自bogotobogo):

  

我们无法在类声明中初始化静态成员变量。 那是因为声明是对如何分配内存的描述,但它不分配内存。我们通过使用该格式创建对象来分配和初始化内存。

     

对于静态类成员,我们独立地初始化静态成员,在类声明之外使用单独的语句。那是因为静态类成员是单独存储而不是作为对象的一部分存储。

     

在类声明中初始化静态数据成员的例外是静态数据成员是整数或枚举类型的const。

我对此的看法是......

静态成员作为类的成员而不是作为类的每个对象中的实例存在。

当您在类声明中初始化静态变量时,作为概念,它将在每次创建类的对象/实例时重新初始化(而不是实际行为), [因为类声明是构建该类的每个新对象的蓝图]。

但我们知道这不应该是静态成员的行为,因此该成员的初始化在类声明之外。

我发现这个解释更直观,但仍然是正式解释仍然是第一个。

答案 3 :(得分:-3)

除了别人所说的之外,目前在一个类中没有地方(前C ++ 11)可以初始化一个静态成员(因为成员(静态和非静态都不能在声明的地方初始化)对于非静态成员,我们使用constructormember initializer list进行初始化。但这意味着我们必须创建该类的实例。

由于静态成员初始化不依赖于正在创建的实例,因此它在声明成员的类之外完成。