0

我编写了以下示例代码:

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

4 回答 4

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从您的评论之一看来,您似乎确实意识到该变量只有一个实例。请注意,初始化赋值是两件不同的事情。

于 2011-12-09T10:37:34.507 回答
2

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

int   MyClass::a = 1;

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

你应该在这里阅读更多关于它的信息:http: //www.bogotobogo.com/cplusplus/statics.php

于 2011-12-09T10:39:57.037 回答
1

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

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

于 2011-12-09T10:38:33.123 回答
0

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

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

非常量静态 int 成员必须在文件范围内定义,并且您可以在此处显式初始化它,就像您在示例中所做的那样。如果您省略了初始化程序 ( 1),您的变量,因为它具有静态持续时间,将由编译器使用0.

于 2011-12-09T11:03:34.613 回答