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



我编写了以下示例代码:

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);
}

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

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

简单,在构造函数体中为a赋值:

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

您不能使用初始化列表来这样做,因为a没有被初始化,它只是被分配给一个新值。在调用构造函数之前,在程序开始时,a初始化为值0(未初始化的static变量设置为0)。

这是编译器告诉你的,相当直接:

error: ' int MyClass::a '是静态数据成员;它只能在定义

处初始化

看起来有点傻,你确定它应该是static,而不是一个实例变量?在整个程序中,只有一个static变量的实例,它的生命周期从程序开始执行到程序结束。

EDIT:似乎你确实意识到只有一个static变量的实例,通过你的一个评论的外观。只需注意初始化赋值是两件不同的事情。

关键字static声明成员变量在每个类实例中将不具有自己的值,而是使用您编写的代码行初始化的一个值:

int   MyClass::a = 1;

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

您应该在这里阅读更多信息:http://www.bogotobogo.com/cplusplus/statics.php

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

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

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

你不能这么做。静态数据成员不是类的对象/实例的一部分,而是独立的对象,只创建和初始化一次,通常是在程序启动时。在创建一个新的类实例时,你能做的是给它赋一个新的值。(但问题是为什么要这样做——使用应该是实例特定的非静态成员;静态成员在类的所有实例之间共享。

非const静态int成员必须在文件作用域中定义,这是您可以显式初始化它的地方,就像您在示例中所做的那样。如果您省略了初始化器(1),您的变量,因为它具有静态持续时间,将由编译器使用0初始化。

最新更新