“只有静态常量积分变量才能在类中初始化”

时间:2015-05-10 07:35:02

标签: c++ class variables static

有人可以向我解释为什么我不能在类中初始化一个静态变量?编译时间到底发生了什么?

例如:

class Object {
    static int numberOfObjects = 0; // This gives the error
    Object(){ 
        nummberOfObjects++;
    }
};

谢谢!

2 个答案:

答案 0 :(得分:0)

这只是编译器实现的标准规则。事实上它是一个规则并不意味着相反是不可能的,因为新的C ++ 11标准和编制者的变化显示。

答案 1 :(得分:-2)

在C ++ 11之前的C ++版本中,语言标准根本不允许您在类声明中执行静态变量定义。换句话说,您无法初始化它,因为它不是常量。由于它可以在执行期间更改,因此编译器需要在某处分配一些内存以实际保留值。由于这是一个类声明,它实际上并没有为您分配内存。这个问题对于const值并不存在,因为它们不需要分配内存 - 它们实际上是"硬编码的"就像你用文字(或旧的' C'样式#define)替换它们一样。

你需要在类声明之外的一行代码基本上说:

    int Object::numberOfObjects = 0;

这一行不仅仅是初始化静态类变量,而是实际分配一个用于存储值的静态int。类声明中的代码行不会这样做 - 它只是告诉编译器这样的值存在于某处。

请注意,从C ++ 11开始,这种行为是不同的。该语言现在足够聪明,可以确定您是否希望定义该内存,因此您不再需要手动执行此操作。