【问题标题】:Initialize a static non-const data member of a class初始化类的静态非常量数据成员
【发布时间】:2011-12-09 10:32:45
【问题描述】:

我编写了以下示例代码:

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

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

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

【问题讨论】:

  • 这毫无意义。如果你需要“类的每个对象”的东西,那么它就不是静态的。
  • 您确实意识到您的静态 int 在 MyClass 的所有实例中具有相同的值?
  • @Kerresk:我知道静态数据成员只会存在一份副本。但是我需要在每次创建对象时为其分配一个值,以便先前创建的对象也共享相同的值。这有意义吗?
  • 现在你说“分配”,而在你的问题中你说“初始化”。这令人困惑。在处理复杂的技术问题时,注意细节很重要。

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


【解决方案1】:

简单,赋值一个值给构造函数体中的a

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

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

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

错误:‘int MyClass::a’是静态数据成员;它只能在定义时初始化

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

编辑:从您的一个 cmets 看来,您似乎确实意识到 static 变量只有一个实例。请注意,initializationassignment 是两个不同的东西。

【讨论】:

    【解决方案2】:

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

    int   MyClass::a = 1;
    

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2012-02-18
          • 1970-01-01
          • 2011-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-18
          相关资源
          最近更新 更多