初始化类的静态非const数据成员

时间:2011-12-09 10:32:46

标签: c++ initialization initializer-list static-data

我写了以下示例代码:

class MyClass {
    static int a;
  public:
    MyClass ( int i ) : a ( i )    {
      cout << " \n ctor called. a is : "<< a << " \n";
    }
};

int   MyClass::a = 1;   

int main( ) {
    MyClass my(2);
}

我知道这会产生编译错误,因为静态数据成员不能在构造函数初始化列表中使用。

那么每次创建类的对象时如何初始化静态数据成员?我希望从构造函数调用的静态成员函数可以做到这一点。这是唯一可能的方式吗?

4 个答案:

答案 0 :(得分:5)

简单,值分配给构造函数体中的a

MyClass ( int i )  {
  a = i;
  cout << " \n ctor called. a is : "<< a << " \n";
}

您无法使用初始化列表来执行此操作,因为a未进行初始化,只是已分配新值。在调用构造函数之前,在程序开始时,a初始化到值0(未初始化的static变量设置为0)。

这是编译器告诉你的,这是相当简单的:

  

错误:'int MyClass :: a'是一个静态数据成员;它只能在其定义中初始化

虽然看起来很傻,但你确定它应该是static而不是实例变量?整个程序中只存在static变量的一个实例,并且从程序执行开始到程序终止都有一个生命周期。

编辑:看来您确实意识到,只有一个static变量的实例,根据您的一条评论的外观。请注意,初始化赋值是两回事。

答案 1 :(得分:2)

关键字static表明你的成员变量对于每个类实例都没有自己的值,而是一个用你编写的代码行初始化的值:

int   MyClass::a = 1;

构造函数的目标是初始化实例,但静态变量成员与实例无关,因此您无法在初始化列表中初始化它们,初始化列表用于初始化非静态成员。如果为变量赋值而不是在构造函数的初始化列表中,则只需替换变量的值,因为它是静态的。

您应该在此处详细了解:http://www.bogotobogo.com/cplusplus/statics.php

答案 2 :(得分:1)

静态成员变量应该对于类的所有实例保持不变。如果要在构造函数中更改它,请使用普通成员变量。

但要回答你的问题:是的,你可以调用静态成员函数来设置变量。或者只是将它设置在函数体中,而不是在初始化列表中。

答案 3 :(得分:0)

How to initialize the static data member each time an object of the class is created?

你不能这样做。静态数据成员不是类的对象/实例的一部分,而是自己的对象,只创建一次初始化,通常在程序启动时。您在创建新类实例时可以做的是为其分配新值。 (但问题是为什么要这样做 - 使用应该是特定于实例的非静态成员;静态成员在所有类的实例之间共享。)

非const static int成员必须在文件范围内定义,并且这是您可以显式初始化它的位置,就像您在示例中所做的那样。如果您省略了初始值设定项(1),则您的变量(因为它具有静态持续时间)将由编译器使用0进行初始化。